How do you get Perl to stop and give a stack trace when you reference an undef value, rather than merely warning? It seems that use strict;
isn't sufficient for this purpose.
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
The first line makes the warning fatal. The next two cause a stack trace when your program dies.
See also man 3pm warnings
for more details.
Instead of the messy fiddling with %SIG
proposed by everyone else, just use Carp::Always
and be done.
Note that you can inject modules into a script without source modifications simply by running it with perl -MCarp::Always
; furthermore, you can set the PERL5OPT
environment variable to -MCarp::Always
to have it loaded without even changing the invocation of the script. (See perldoc perlrun
.)
Include this:
use Carp ();
Then include one of these lines at the top of your source file:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
The confess
line will give a stack trace, and the cluck
line is much more terse.
One way to make those warnings fatal is to install a signal handler for the WARN virtual-signal:
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With