Well, duh, yeah, I want to cluck. Woops. However, it still gives me a wierd behaviour:
$ perl a.pl
Use of uninitialized value in print at a.pl line 11 (#1)
(W uninitialized) An undefined value was used as if it were alread
+y
defined. It was interpreted as a "" or a 0, but maybe it was a mi
+stake.
To suppress this warning assign a defined value to your variables.
To help you figure out what was undefined, perl tells you what ope
+ration
you used the undefined value in. Note, however, that perl optimiz
+es your
program and the operation displayed in the warning may not necessa
+rily
appear literally in your program. For example, "that $foo" is
usually optimized into "that " . $foo, and the warning will refer
+to
the concatenation (.) operator, even though there is no . in your
program.
Use of uninitialized value in print at a.pl line 11.
at a.pl line 11
main::foo() called at a.pl line 14 (#1)
Use of uninitialized value in print at a.pl line 11.
at a.pl line 11
main::foo() called at a.pl line 14
at a.pl line 11
main::foo() called at a.pl line 14
done.
For some reason, I'm getting that warning twice. Note also that I had to add a few extra lines to the callstack function:
sub callstack
{
&$oldwarn if $oldwarn;
require Carp;
delete $SIG{__WARN__};
goto &Carp::cluck;
$SIG{__WARN__} = \&callstack;
}
For some reason, Carp::cluck calls warn, so disabling the warn handler gets rid of the infinite recursion. A bit more digging changes the above to:
sub callstack
{
&$oldwarn if $oldwarn;
require Carp;
print STDERR Carp::longmess(@_);
}
which solves the problem - the warning message only shows on the screen once. |