Dein Script produziert zur Laufzeit eine ganze Menge warnings, die ausgegeben werden, bevor Du "print $c->header();" sagst.
Super.
Daher schon meine Frage ob er das Skript mal in einer Konsole getestet hat.
Mach Dein "print $c->header();" mal direkt nach "my $c = new CGI;", dann solltest Du es sehen. Behebe die dann sichtbaren Probleme und alles wird gut.
Die Warnungen werden vermutlich noch davor ausgespuckt. Da er aber sowieso schon CGI::Carp verwendet, wäre das eine Möglichkeit:
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
Struppi.