2008-09-16 14 views

回答

19
use warnings FATAL => 'uninitialized'; 

use Carp(); 
$SIG{__DIE__} = \&Carp::confess; 

第一行使警告致命。当你的程序死亡时,接下来的两个会导致堆栈跟踪。

+0

作为最后两行的替代品,“使用Carp :: Always”。 – 2012-10-09 14:21:58

4

包含此:

use Carp(); 

然后包括这些线路在源文件的顶部一个

local $SIG{__WARN__} = \&Carp::confess; 
local $SIG{__WARN__} = \&Carp::cluck; 

confess行会给出一个堆栈跟踪,并cluck线更简洁。

1

引用一个undef值本身并不是问题,但如果你的代码期望它不是undef,它可能会导致警告。 (特别是如果你试图将该变量用作对象引用)。 你可以把东西在你的代码,如:

use Carp qw(); 

[....] 

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

[....] 
1

的一种方法,使这些警告致命的是安装了一个信号处理器WARN虚拟信号:除了

$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ }; 
15

的与其他人提出的%SIG杂乱摆弄,只是use Carp::Always而已。

请注意,只要通过运行perl -MCarp::Always,您就可以将模块注入脚本而无需修改源代码;此外,您可以将PERL5OPT环境变量设置为-MCarp::Always,以便在甚至不更改脚本调用的情况下加载它。 (请参阅perldoc perlrun。)

0

您必须手动执行此操作。上述“答案”不起作用!刚考出这样的:

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

一个空的散列产生0.这似乎是一个特例。 – marinara 2012-09-18 08:13:19

相关问题