为什么Perl短路评估会导致检查rvalue?

时间:2012-04-01 20:52:00

标签: perl

我不明白为什么会这样:

my $err = undef;

while(1){
  if($err && ($err->code == 502)) {
    [...]
  }
  [...]
  eval {...}
  $err = $@;
}

在perl v5.8.8中产生Can't call method "code" on an undefined value at ./filename.pl line 74.。 换句话说:为什么perl执行第二个布尔表达式,即使OP1 && OP2构造不能变为真,因为第一个操作数为false(undef)。

即使更详细的版本if( (defined $err) && ($err->code == 502))也会产生相同的结果。

提前致谢:)

3 个答案:

答案 0 :(得分:1)

有关信息,当我在Perl 5.10.1解释器上运行您的代码时,我根本没有收到任何错误消息。 (这实际上是一个注释而不是一个答案,只是它不适合注释列。它不需要upvote。)

#!/usr/bin/perl
use warnings;
use strict;
use integer;

my $err = undef;

while(1){
  if($err && ($err->code == 502)) {
    warn;
  }
  eval {1};
  $err = $@;
}

答案 1 :(得分:1)

如果它是unf,如你所说,如果从该代码中获得该行为,则该版本的Perl或您的perl版本是错误的。两者都不可能。

但它可能不是坏事。请记住,错误可能不是来自循环的第一次传递。 $err可能包含一个带有错误重载运算符的对象(例如,不一致的布尔值和字符串化重载)。以下是什么?

use Devel::Peek;
Dump($err);

答案 2 :(得分:0)

undef之后$ err($ @)显然不是eval{}的原因是eval中的衍生函数返回错误,因为它无法从中读取文件没有被周围的代码捕获:(

感谢@ikegami的建议,毕竟我使用转储得到了跟踪。

问题的解决方案因此不在民主之中,对不起。我只需要创建文件......