代码之家  ›  专栏  ›  技术社区  ›  Steve Schnepp

Perl中的“”和“或”有什么区别?

  •  32
  • Steve Schnepp  · 技术社区  · 15 年前

    C型运算符有什么区别 && , || ,…以及他们的Perl人类可读版本” and “,” or “…?

    似乎 互联网代码 两者都使用:

    open (FILE, $file) or die("cannot open $file");
    open (FILE, $file) || die("cannot open $file");
    
    4 回复  |  直到 8 年前
        1
  •  38
  •   joe    15 年前

    来自Perl文档..

    这是列表运算符。在列表运算符的右侧,它的优先级非常低,因此它控制所有在那里找到的逗号分隔表达式。唯一优先级较低的运算符是逻辑运算符“and”、“or”和“not”,可用于评估对列表运算符的调用,而不需要额外的括号。 逻辑或、定义或、排他或

    binary“or”返回两个周围表达式的逻辑析取。它相当于,只是优先级很低。这使得它对控制流很有用

    print FH $data      or die "Can't write to FH: $!";
    

    这意味着它会短路:即,只有当左表达式为假时,才会计算右表达式。由于它的优先级,您可能应该避免将其用于分配,仅用于控制流。

    $a = $b or $c;      # bug: this is wrong
    ($a = $b) or $c;        # really means this
    $a = $b || $c;      # better written this way
    

    但是,当它是一个列表上下文分配,并且您试图使用“”作为控制流时,您可能需要“或”以便分配具有更高的优先级。

    @info = stat($file) || die;     # oops, scalar sense of stat!
    @info = stat($file) or die;     # better, now @info gets its due
    

    同样,你也可以使用括号。

    • γ

    如果任何列表运算符(print()等)或任何一元运算符(chdir()等)后跟左括号作为下一个标记,则括号中的运算符和参数将被视为具有最高优先级,就像普通函数调用一样。例如,因为命名的一元运算符的优先级高于:

    chdir $foo    || die;   # (chdir $foo) || die
    chdir($foo)   || die;   # (chdir $foo) || die
    chdir ($foo)  || die;   # (chdir $foo) || die
    chdir +($foo) || die;   # (chdir $foo) || die
    
        2
  •  35
  •   dave4420    15 年前

    唯一的区别是它们的优先级。

    open FILE,  $file or die("cannot open $file");   # this works
    open FILE,  $file || die("cannot open $file");   # this doesn't work
    open FILE, ($file || die("cannot open $file"));  # why it doesn't work
    
        3
  •  29
  •   ysth    15 年前

    ! , && , || ^ 具有高优先级,以便在构造表达式时有用; not , and , or xor 优先级较低,因此它们对于本质上不同的表达式之间的流控制非常有用。

        4
  •  9
  •   Inshallah    15 年前

    “&&”和“”运算符的优先级高于它们的“和”、“或”对应运算符。