当你引用一个undef值而不仅仅是警告时,你如何让Perl停止并给出栈跟踪?看起来use strict;
不足以达到此目的。如何让Perl在引用undef值时停止?
14
A
回答
19
use warnings FATAL => 'uninitialized';
use Carp();
$SIG{__DIE__} = \&Carp::confess;
第一行使警告致命。当你的程序死亡时,接下来的两个会导致堆栈跟踪。
4
包含此:
use Carp();
然后包括这些线路在源文件的顶部一个:
local $SIG{__WARN__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
的confess
行会给出一个堆栈跟踪,并cluck
线更简洁。
1
引用一个undef值本身并不是问题,但如果你的代码期望它不是undef,它可能会导致警告。 (特别是如果你试图将该变量用作对象引用)。 你可以把东西在你的代码,如:
use Carp qw();
[....]
Carp::confess '$variableName is undef' unless defined $variableName;
[....]
1
的一种方法,使这些警告致命的是安装了一个信号处理器WARN虚拟信号:除了
$SIG{__WARN__} = sub { die "Undef value: @_" if $_[0] =~ /undefined/ };
15
的与其他人提出的%SIG
杂乱摆弄,只是use Carp::Always
而已。
请注意,只要通过运行perl -MCarp::Always
,您就可以将模块注入脚本而无需修改源代码;此外,您可以将PERL5OPT
环境变量设置为-MCarp::Always
,以便在甚至不更改脚本调用的情况下加载它。 (请参阅perldoc perlrun
。)
0
您必须手动执行此操作。上述“答案”不起作用!刚考出这样的:
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作为无效的引用。我怀疑这是如此的设计,所以autovivification无缝工作。
+0
一个空的散列产生0.这似乎是一个特例。 – marinara 2012-09-18 08:13:19
相关问题
- 1. 在Perl中使用defined/undef
- 2. 如何在Perl中将undef值打印为零?
- 3. 如何让循环随时间停止?
- 4. 如何让定时器停止点击
- 5. 如何在Perl中停止输入?
- 6. 为什么undef值在Perl中成为有效的数组引用?
- 7. as3:如何让MovieClip停止
- 8. 如何检查Perl中的值是否为undef?
- 9. 如何让Apache在Ubuntu上停止?
- 10. 如何让TcpClient在线程中停止?
- 11. 如何让Application_End在调试时(或停止调试时)运行?
- 12. 的Perl:停止在窗口
- 13. perl如何在perl中停止外部程序
- 14. 动画停止时如何停止恢复到原始值
- 15. 如何让在bash子进程停止前值
- 16. 如何在查找datagridview复选框值时停止空引用异常?
- 17. 无法停止perl
- 18. 如何在应用程序停止时停止警报服务?
- 19. 我如何让Eclipse/EPIC在我的perl脚本中停止警告“使用未初始化的值$ ENV {whatever}”?
- 20. 如何让SciPy.integrate.odeint在路径关闭时停止?
- 21. 如何在释放移动它的键时让矩形停止?
- 22. 如何让这个脚本在取消时实际停止?
- 23. 如何在一个DIV打开时让文本停止移动?
- 24. 如何让R脚本在必须读取一行时停止?
- 25. 如何让这些图像在切换时停止“闪烁”?
- 26. 如何在使用JS时停止HTMLAudioElement?
- 27. 如何在定时器停止时停止剩余动作?
- 28. 如何在Perl中暂停实时
- 29. 如何在应用程序停止后让计时器继续倒计时?
- 30. 如何在用户未输入值时停止程序崩溃?
作为最后两行的替代品,“使用Carp :: Always”。 – 2012-10-09 14:21:58