评估之后,Perl的$ @是否会被不确定?

bri*_*foy 5 perl eval

我正在研究Mastering Perl“错误处理和报告”一章。在perlvar的条目中,它说:$@

来自最后一个eval()运算符的Perl语法错误消息。如果$ @是空字符串,则最后一个eval()会正确解析并执行(尽管您调用的操作可能以常规方式失败了)。

现在,我想知道何时评估可能无法正确执行,而留下$@未定义的值。有这种情况吗?

Mic*_*ebs 2

如果有人读了这个问题并且仍然想知道(就像我一样)$@在 后是否可以 undefined eval,我相信答案是否定的。(我还在旧的 5.8.3 文档中读到 $@是“null” ,我很困惑,因为“null”不是 Perl 中经常使用的术语。)

我不了解 Perl 内部知识来证实这一点,但看起来文档最终在 2015 年通过此提交修复了,这是由于此问题而产生的。 perlvar 的条目现在显示“空字符串”而不是“null”:

来自最后一个“eval”运算符的 Perl 错误,即捕获的最后一个异常。对于“eval BLOCK”,这要么是运行时错误消息,要么是调用“die”时使用的字符串或引用。“eval STRING”形式还可以捕获语法错误和其他编译时异常。

如果没有错误发生,“eval”将 $@ 设置为空字符串。


另外,鉴于 $@ 可以设置为“调用模具的字符串或引用”,我想我会确保die undef没有这样做。事实上,这样做是由 Perl 捕获和处理的:

% perl -we 'eval { die undef }; print "EVAL_ERROR: $@"'
Use of uninitialized value in die at -e line 1.
EVAL_ERROR: Died at -e line 1.
Run Code Online (Sandbox Code Playgroud)