在评估之后Perl的$ @会不会被定义?

时间:2013-07-21 19:49:05

标签: perl eval

我正在研究"Error Handling and Reporting"Mastering Perl章节。在$@的{​​{1}}条目中,它说:

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

现在我想知道perlvar何时可能无法正确执行,$@的值不确定。有这种情况吗?

3 个答案:

答案 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.
';
相关问题