代码之家  ›  专栏  ›  技术社区  ›  mob

Perl的(or,and)和(| |,&&&)短路运算符之间有什么区别?

  •  30
  • mob  · 技术社区  · 15 年前

    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和Perl4开始学习Perl5,并一直使用 || or 我喜欢它的样子。但正如上面的测试所显示的,对于粗心的人来说,这并非没有陷阱。对于同时使用这两种结构或大量使用 ,您使用什么样的经验法则来决定要使用哪个构造,并确保代码执行您认为它正在执行的操作?

    5 回复  |  直到 15 年前
        1
  •  42
  •   Igor ostrovsky    12 年前

    由于'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

        2
  •  18
  •   jrockway    15 年前

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

    operator precedence 规则。

    || 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
  •  8
  •   perimosocordiae    15 年前

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

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

        4
  •  2
  •   Ed Swangren    15 年前

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

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

        5
  •  2
  •   Stefan Kendall    15 年前

    我猜or3是不同的。

    我并不是一个真正喜欢Perl的人,但看起来1、2和4都显式返回布尔值。我猜3有副作用,比如退回$a或类似疯狂的东西。

    俯视

    嘿,我是对的。