我不明白为什么会这样:
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))
也会产生相同的结果。
提前致谢:)
答案 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的建议,毕竟我使用转储得到了跟踪。
问题的解决方案因此不在民主之中,对不起。我只需要创建文件......