提问人:Neil 提问时间:9/17/2008 最后编辑:zigdonNeil 更新时间:5/23/2022 访问量:2708
如何让 Perl 在引用 undef 值时停止?
How can you get Perl to stop when referencing an undef value?
答:
4赞
Neil
9/17/2008
#1
包括以下内容:
use Carp ();
然后在源文件的顶部包含以下行之一:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
该行将给出堆栈跟踪,并且该行更加简洁。confess
cluck
20赞
cjm
9/17/2008
#2
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
第一行使警告致命。接下来的两个方法会在程序死机时导致堆栈跟踪。
有关详细信息,另请参阅。man 3pm warnings
评论
0赞
Stefan Majewsky
10/9/2012
作为最后两行的替代方法,.use Carp::Always
1赞
mopoke
9/17/2008
#3
引用 undef 值本身并不是问题,但如果代码期望它不是 undef,则可能会导致警告。(特别是当您尝试将该变量用作对象引用时)。 你可以在代码中加入一些东西,例如:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
2赞
zigdon
9/17/2008
#4
使这些警告致命的一种方法是为 WARN 虚拟信号安装信号处理程序:
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
15赞
Aristotle Pagaltzis
9/17/2008
#5
而不是其他人提出的凌乱摆弄,只是完成。%SIG
use Carp::Always
请注意,只需使用 ;此外,您可以将环境变量设置为在不更改脚本调用的情况下加载它。(参见 perldoc perlrun
。perl -MCarp::Always
PERL5OPT
-MCarp::Always
0赞
user736584
5/4/2011
#6
您必须手动执行此操作。上面的“答案”是行不通的!只需测试一下:
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 作为无效引用。我怀疑这是设计使然,因此自动生存可以无缝地工作。
评论
0赞
marinara
9/18/2012
空哈希生成 0。这似乎是一个特例。
0赞
U. Windl
5/23/2022
我认为是专门处理的(为了方便起见)视为虚假。也许会有所作为。if ($var)
undef
if ("$var")
评论