如何让Perl在引用undef值时停止?
use warnings FATAL => 'uninitialized';
use Carp();
$SIG{__DIE__} = \&Carp::confess;
第一行使警告致命。当你的程序死亡时,接下来的两个会导致堆栈跟踪。
包含此:
use Carp();
然后包括这些线路在源文件的顶部一个:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
的confess
行会给出一个堆栈跟踪,并cluck
线更简洁。
引用一个undef值本身并不是问题,但如果你的代码期望它不是undef,它可能会导致警告。 (特别是如果你试图将该变量用作对象引用)。 你可以把东西在你的代码,如:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
的一种方法,使这些警告致命的是安装了一个信号处理器WARN虚拟信号:除了
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
的与其他人提出的%SIG
杂乱摆弄,只是use Carp::Always
而已。
请注意,只要通过运行perl -MCarp::Always
,您就可以将模块注入脚本而无需修改源代码;此外,您可以将PERL5OPT
环境变量设置为-MCarp::Always
,以便在甚至不更改脚本调用的情况下加载它。 (请参阅perldoc perlrun
。)
您必须手动执行此操作。上述“答案”不起作用!刚考出这样的:
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";
}
你会看到,非关联没有造成任何错误消息或警告。我知道没有办法导致Perl自动检测到使用undef作为无效的引用。我怀疑这是如此的设计,所以autovivification无缝工作。
一个空的散列产生0.这似乎是一个特例。 – marinara 2012-09-18 08:13:19
作为最后两行的替代品,“使用Carp :: Always”。 – 2012-10-09 14:21:58