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/ };
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;
[....]
You have to do this manually. The above "answers" do not work! Just test out this:
use strict;
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
my $x = undef; # it would be enough to say my $x;
if (!$x->{test}) {
print "no warnings, no errors\n";
}
You will see that dereferencing did not cause any error messages or warnings. I know of no way of causing Perl to automatically detecting the use of undef as an invalid reference. I suspect this is so by design, so that autovivification works seamlessly.
if ($var)
is specially handled (for convenience) to treat undef
as false. Maybe if ("$var")
makes the difference. –
Whirlybird © 2022 - 2024 — McMap. All rights reserved.
use Carp::Always
. – Paton