当您引用 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 的使用作为无效引用。我怀疑这是设计使然,因此自动生存可以无缝地进行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top