当你引用一个undef值而不仅仅是警告时,你如何让Perl停下来并给出一个堆栈跟踪? 看来use strict; 不足以达到这个目的。

===============>>#1 票数:20 已采纳

use warnings FATAL => 'uninitialized';

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

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

===============>>#2 票数:15

而不是use Carp::Always其他人提出的%SIG的混乱,只需use Carp::Always完成。

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

===============>>#3 票数:4

包括这个:

use Carp ();

然后在源文件的顶部包含以下行之一

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

confess行会给出一个堆栈跟踪,并cluck线更加简洁。

===============>>#4 票数:1

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

use Carp qw();

[....]

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

[....]

===============>>#5 票数:1

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

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

===============>>#6 票数: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作为无效引用。 我怀疑这是设计的,所以autvivification无缝地工作。

  ask by Neil translate from so

未解决问题?本站智能推荐:

1回复

为什么Perl的字符串乘法不会对undef发出警告?

下 表达式 和 都生产 但是下面的表达式给出了没有警告的空字符串: 谁知道为什么? 我的意思是,有一个很好的字符串化习惯很酷( $_ x 1比defined ? "$_" : ''短得多defined ? "$_" : '' ),但感觉有点奇怪。
3回复

Perl Eval中的警告

我需要在eval中隐藏警告,但其余代码应该继续发出警告消息。 这是我的 - 现在$ hash的值 - > {key}可以是一个函数调用,如: $another_var是undef (或"" )时出现问题。 该脚本只是通过以下消息进行解析 - 参数“”在(e
1回复

在perl中分配多个值,undef麻烦

我想从perl子例程返回几个值并批量分配它们。 这在某些时间有效,但在其中一个值是undef时无效: Perl似乎将这些值连接在一起,而忽略undef元素。 我期望像在Python或OCaml中那样分解结构。 有没有简单的方法将返回值分配给多个变量? 编辑:这是我现在
3回复

为什么这个Perl片段没有检测到'undef'?

我希望输入第二个“if”语句中的块是因为undef值,但是日志显示它没有被输入。 日志文件显示: 任何想法都感激不尽。 编辑:对不起,我已经编辑了代码以显示基本流程。 我应该更好地校对它。 我在getcmd()中添加了$ ret来模拟日志函数中发生的事情,它只打
4回复

在Perl中,是否有手动将undef转换为0的优雅方式?

我有一个这种形式的片段: 由于涉及两个以上的变量,现实更加混乱。 我真正想写的是: 并且undef正确评估为0,但几乎每次运行都会收到这些警告: 让这些消息消失的最佳方法是什么? 注意:如果相关,我会使用严格的'和'使用警告'。
1回复

undef值并打印它

这是我第一次使用Perl。 在Perl线程中,如果上下文是标量,则threads->exit()子例程的返回值是undef值。 输出是: 为什么要print "$re\\n\\n"; 打印已执行但未print (undef) . "TES\\n"; print (u
1回复

Perl`defined'和`undef'子例程范围

请看下面的代码: 输出是 第一个print语句可以打印,这是否意味着解释器(或编译器?)进一步查看并查看子例程定义? 如果是这样,为什么它没有看到undef &myf; 作为第二个print声明? 谢谢
4回复

如何在Perl中为未定义的值打印文字“null”?

我正在运行查询'describe table',它为'default'列返回'null'的值。 但是,当我尝试将数据库中的值打印到HTML表时,它不会打印'null'。 它总是空白的。 这就是我存储数据库中数据的方式: 当我打印数组@nulls的内容时,它永远不会打印'null
1回复

Spreadsheet :: ParseExcel $ cell-> value()返回undef

我是perl的新手,但电子表格excel解析器模块遇到了麻烦。 当我在自己的行上使用$ cell-> value()时,似乎没有问题,但是当我尝试使用它将值插入数组时,它返回undef,代码如下所示: 在这里打印$ cell-> value; 返回单元格的内容,但显示
3回复

如何在Perl中从printf渲染未定义的值?

我正在寻找一种优雅的方式来表示格式化数字通常呈现的情况下的未定义值。 我会举一个小例子。 对于初学者,你当然不能使用这个: ...因为“使用警告”会在第三次迭代中指出“使用未初始化的值...”。 所以下一步是这样的: 而且,男孩,顺便说一下,我喜欢新的5.10'//'运算符