我正在研究"Error Handling and Reporting"的Mastering Perl章节。在$@
的{{1}}条目中,它说:
来自最后一个eval()运算符的Perl语法错误消息。如果$ @是空字符串,则最后一个eval()被正确解析并执行(尽管您调用的操作可能以正常方式失败)。
现在我想知道perlvar何时可能无法正确执行,$@
的值不确定。有这种情况吗?
答案 0 :(得分:4)
这是一种方法(但在你阅读它之前坐下来。;))
$@ = 123;
eval q{
$@ = 456;
print ">>>$@<<<\n";
goto SKIP;
};
SKIP:
print ">>>$@<<<\n";
答案 1 :(得分:2)
BACKGROUND section of the Try::Tiny docs包含一些关于$@
如何被破坏的信息以及为什么Try :: Tiny需要特别注意避免使用clobberage,并始终测试eval
的返回值而不是测试$@
求真相。所有这些都在那里,因为某人在某些时候碰到了他们,但我认为eval
- in - DESTROY
场景是最有可能将某人绊倒的人。基本上,如果die
导致某个对象超出范围,并且该对象的DESTROY
调用eval
,则die
开始时的值为eval
无可挽回地失去了。假设DESTROY
中的$@
没有抛出错误,""
将eval
跟在外{{1}}之后。< / p>
答案 2 :(得分:1)
谁说过将$@
设为undef?
“正确解析并执行的最后一个eval()”没有任何意义:eval
在运行时未被解析。当然,它意味着“最后一个eval(),其表达式被正确解析和执行”。换句话说,“最后一个eval(),其表达式已编译,并且在执行时不会抛出任何异常”。
>perl -MData::Dumper -e"$@=123; eval ''; print(Dumper($@));"
$VAR1 = '';
>perl -MData::Dumper -e"$@=123; eval '~~~'; print(Dumper($@));"
$VAR1 = 'syntax error at (eval 1) line 2, at EOF
';
>perl -MData::Dumper -e"$@=123; eval 'die q{x}'; print(Dumper($@));"
$VAR1 = 'x at (eval 1) line 1.
';