Perl(或,和)和(||,&&&)短路运营商之间有什么区别?

时间:2009-10-03 01:43:56

标签: perl short-circuiting

这些子程序中哪一个不像另一个?

sub or1 {
    my ($a,$b) = @_;
    return $a || $b;
}

sub or2 {
    my ($a,$b) = @_;
    $a || $b;
}

sub or3 {
    my ($a,$b) = @_;
    return $a or $b;
}

sub or4 {
    my ($a,$b) = @_;
    $a or $b;
}

我从C和Perl 4来到Perl 5,总是使用||,直到我看到更多使用or的脚本,我喜欢它的样子。但正如上面的测验所显示的那样,对于那些粗心大意的人而言,并非没有缺陷。对于同时使用这两种结构或者使用大量or的人来说,您使用什么经验法则来决定使用哪种结构并确保代码正在执行您认为正在执行的操作?

5 个答案:

答案 0 :(得分:41)

由于'或'运算符的优先级较低,or3解析如下:

sub or3 {
    my ($a,$b) = @_;
    (return $a) or $b;
}

通常的建议是仅使用'或'运算符来控制流程:

@info = stat($file) or die;

有关更多讨论,请参阅perl手册:http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

答案 1 :(得分:18)

  

您使用什么经验法则来决定使用哪种构造并确保代码正在执行您认为正在执行的操作

operator precedence规则。

||紧紧束缚,or弱结合。没有“经验法则”。

如果你必须有一个经验法则,那么“只有在没有左值时才使用or”:

or

open my $fh, '>', 'file' or die "Failed to open file: $!"

||

my $greeting = greet() || $fallback || 'OH HAI';

我同意MJD关于避免parens;如果您不了解规则,请查看它们......但不要写(open(my $fh, '>', 'file')) or (die("Failed to open file: $!"))“只是为了确定”,请。

答案 2 :(得分:6)

在Perl 5中,“或”和“和”的优先级低于“||”和“&&”。查看此PerlMonks线程以获取更多信息:

http://www.perlmonks.org/?node_id=155804

答案 3 :(得分:1)

我的猜测是or3不同。

我不是一个真正的Perl家伙,但它看起来像1,2和4都明确返回布尔值。我猜3有副作用,比如返回$ a或类似疯狂的东西。

向下看

嘿,我是对的。

答案 4 :(得分:1)

两个版本在Perl中都是短路的,但'textual'形式('和'和'或'的优先级低于它们的C风格等价。

http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlop.html#Logical_And