views:

706

answers:

5

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.

+3  A: 

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.

Neil
+14  A: 
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.

cjm
+1  A: 

Referencing an undef value wouldn't be a problem in itself, but it may cause warnings if your code is expecting it to be something other than undef. (particularly if you're trying to use that variable as an object reference). You could put something in your code such as:

use Carp qw();

[....]

Carp::confess '$variableName is undef' unless defined $variableName;

[....]
mopoke
+1  A: 

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/ };
zigdon
+10  A: 

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.)

Aristotle Pagaltzis

related questions