如何让 Perl 在引用 undef 值时停止?

How can you get Perl to stop when referencing an undef value?

提问人:Neil 提问时间:9/17/2008 最后编辑:zigdonNeil 更新时间:5/23/2022 访问量:2708

问:

当你引用一个undef值时,你如何让Perl停止并给出一个堆栈跟踪,而不仅仅是警告?对于这个目的来说,这似乎还不够。use strict;

Perl 警告 undef

评论


答:

4赞 Neil 9/17/2008 #1

包括以下内容:

use Carp ();

然后在源文件的顶部包含以下行之一:

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

该行将给出堆栈跟踪,并且该行更加简洁。confesscluck

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

而不是其他人提出的凌乱摆弄,只是完成。%SIGuse Carp::Always

请注意,只需使用 ;此外,您可以将环境变量设置为在不更改脚本调用的情况下加载它。(参见 perldoc perlrunperl -MCarp::AlwaysPERL5OPT-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)undefif ("$var")