题
当您引用 undef 值时,如何让 Perl 停止并给出堆栈跟踪,而不仅仅是警告?看起来 use strict;
不足以达到此目的。
解决方案
use warnings FATAL => 'uninitialized';
use Carp ();
$SIG{__DIE__} = \&Carp::confess;
第一行使警告变得致命。当程序终止时,接下来的两个会导致堆栈跟踪。
其他提示
而不是杂乱的摆弄 %SIG
其他人都提议的,只是 use 鲤鱼::永远
并完成。
请注意,您可以将模块注入到脚本中,而无需修改源代码,只需运行它即可 perl -MCarp::Always
;此外,您还可以设置 PERL5OPT
环境变量为 -MCarp::Always
甚至无需更改脚本的调用即可加载它。(看 perldoc perlrun
.)
包括这个:
use Carp ();
然后包括 一 源文件顶部的这些行:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
这 confess
行将给出堆栈跟踪,并且 cluck
线路更加简洁。
使这些警告致命的一种方法是安装一个信号处理程序 警告 虚拟信号:
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
引用 undef 值本身不会有问题,但如果您的代码期望它是 undef 以外的值,则可能会导致警告。(特别是如果您尝试使用该变量作为对象引用)。您可以在代码中添加一些内容,例如:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
您必须手动执行此操作。上面的“答案”不起作用!只需测试一下:
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 的使用作为无效引用。我怀疑这是设计使然,因此自动生存可以无缝地进行。
不隶属于 StackOverflow