15

在阅读最新版本的The Camel Book时,我被 p522 上的以下代码片段所震撼:

use Fcntl ":flock";
eval {
    local $SIG{ALRM} = sub { die "alarm clock restart" };
    alarm 10;               # schedule alarm in 10 seconds
    eval {
        flock(FH, LOCK_EX)  # a blocking, exclusive lock
            || die "can't flock: $!";
    };
    alarm 0;                # cancel the alarm
};
alarm 0;               # race condition protection
die if $@ && $@ !~ /alarm clock restart/; # reraise

有人告诉我,您应该始终使用低优先级的逻辑 OR 运算符“或”,而不是逻辑 OR 运算符“||”。

在本书中进一步看,我看到许多其他使用相同逻辑的示例。

规则或优先级是否发生了变化?

还是'||'的处理 和“或”在更高版本的 Perl 中发生了变化?(不幸的是,由于遗留代码,我们被焊接到 5.6.1 atm)。

4

2 回答 2

22

||和的优先级or没有改变。如果您不在函数属性周围使用括号,则使用||withdie有点危险,请考虑

flock FH, LOCK_EX || die "can't flock: $!"; # WRONG!

这就是为什么有些人更喜欢or控制结构。有括号,没有区别。

于 2013-02-15T11:00:16.533 回答
1

[作为一个风格问题,这可能应该是 CW'ed。话虽如此,我确实有意见。]

骆驼是一个糟糕的风格指南。那不是它的工作。它提供的代码是正确的,因为它按照它在锡上所说的做,但是将它的示例变成实际使用的东西大多留给读者作为练习。

至于您的特定问题,请选择英文版本的逻辑,并为您想要一个值的情况保留类似 C 的版本。所以:

if ($x or $y) { ... }
if (my $z = $x || $y) { ... }
$x or die "Ohnoes!"; # Though I prefer `die "Ohnoes!" unless $x;`
return 5 unless $x and $y;
return $x && $y; # Important!  `return $x and $y;` is really-really wrong

这将用最少的括号帮助您浏览大多数代码。

于 2013-02-15T18:11:14.850 回答