引用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
。)