您是否应该使用'||';或更低优先级';或';在Perl中报告错误时?

您是否应该使用'||';或更低优先级';或';在Perl中报告错误时?,perl,operator-precedence,Perl,Operator Precedence,在阅读最新版本时,我被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

在阅读最新版本时,我被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
我被教导,你应该总是使用低优先级的逻辑或运算符'或'优先于逻辑或运算符'| |'

进一步看这本书,我看到很多其他例子使用相同的逻辑

规则或优先级是否已更改


或者,在更高版本的Perl中,对“| |”和“或”的处理是否有所改变?(不幸的是,由于遗留代码,我们被焊接到了5.6.1 atm上)。

的优先级没有改变。将
|
模具一起使用是有点危险的。如果在函数属性周围不使用括号,请考虑

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

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

[作为一个风格问题,这可能应该是CW'ed。也就是说,我确实有一个观点。]

骆驼是一个可怕的风格指南;那不是它的工作。它提供的代码是正确的,因为它按照tin上的说明执行,但将其示例转化为实际使用的内容主要留给读者作为练习

对于您的特定问题,对于逻辑,首选英文版本,对于需要值的情况,保留类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

这将帮助您以最少的括号完成大多数代码。

我更喜欢使用| |表示逻辑(例如,在“if”条件中),使用“or”表示控制流(例如…或die)。谢谢@choroba,因此这会引发一个有趣的问题。考虑到偏好低优先级逻辑OR的想法的普遍性质,为什么Camebook会通过使用“| |”运算符使事情复杂化,而该运算符只在使用括号的情况下工作?有趣。我猜是TMTOWTI!(:我认为如果有人翻阅了骆驼手册并彻底清理了代码,那么这个例子就会变成