【问题标题】:What is the difference between Perl's ( or, and ) and ( ||, && ) short-circuit operators?Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有什么区别?
【发布时间】:2010-12-03 12:13:18
【问题描述】:

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

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 的人,您使用什么经验法则来决定使用哪个构造并确保代码按照您的想法执行?

【问题讨论】:

标签: perl short-circuiting


【解决方案1】:

由于'or'运算符的优先级较低,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

【讨论】:

  • 'or' 运算符的优先级甚至低于赋值运算符,所以要小心。
【解决方案2】:

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

operator precedence 规则。

|| 绑定紧密,or 绑定较弱。没有“经验法则”。

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

or:

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

||:

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

我同意 MJD 关于避免使用括号的观点;如果您不知道规则,请查一下……但请不要写(open(my $fh, '>', 'file')) or (die("Failed to open file: $!"))“只是为了确定”。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这两个版本在 Perl 中都是短路的,但“文本”形式(“and”和“or”)的优先级低于其 C 风格的等效形式。

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

      【讨论】:

        【解决方案5】:

        我的猜测是 or3 是不同的。

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

        往下看

        嘿,我是对的。

        【讨论】:

        • 正确,但你没有说为什么。
        • @Ether:我不知道为什么。 :P
        • 猜谜游戏你赢了!
        猜你喜欢
        • 1970-01-01
        • 2021-11-08
        • 2021-11-08
        • 1970-01-01
        • 2011-10-22
        • 2021-04-19
        • 2011-07-29
        • 2012-09-09
        • 2011-01-02
        相关资源
        最近更新 更多