引用undef值时,如何使Perl停止?

时间:2020-03-05 18:57:23  来源:igfitidea点击:

当我们引用undef值而不只是警告时,如何使Perl停止并给出堆栈跟踪?看来"严格使用"并不足以达到这个目的。

解决方案

回答

包括以下内容:

use Carp ();

然后在源文件顶部包括以下几行之一:

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

" confess"行将给出堆栈跟踪,而" cluck"行则更为简洁。

回答

use warnings FATAL => 'uninitialized';

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

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

回答

引用一个undef值本身并不是问题,但是如果代码期望它不是undef,则引用它可能会引起警告。 (特别是如果我们尝试使用该变量作为对象引用)。
我们可以在代码中添加一些内容,例如:

use Carp qw();

[....]

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

[....]

回答

使这些警告致命的一种方法是为WARN虚拟信号安装信号处理程序:

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

回答

与其使用其他人提议的%SIG进行的混乱处理,不如使用Carp :: Always并完成操作。

注意,我们可以简单地通过使用perl-MCarp :: Always;运行模块而无需修改源代码就将模块注入脚本中。此外,我们可以将环境变量" PERL5OPT"设置为" -MCarp :: Always",以在不更改脚本调用的情况下加载它。 (请参见perldoc perlrun。)