“||”有什么区别和“或”在Perl?

时间:2009-07-16 09:58:49

标签: perl operators

C风格的运算符&&||,...和它们的Perl人类可读版本“and”,“or”之间有什么区别,......?

似乎互联网代码使用它们:

open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");

4 个答案:

答案 0 :(得分:39)

来自Perl Doc ..

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

二进制“或”返回两个周围表达式的逻辑分离。它相当于||除了非常低的优先权。这使它对控制流有用

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

答案 1 :(得分:36)

唯一的区别是他们的优先权。

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

答案 2 :(得分:30)

!&&||^具有高优先级,因此它们可用于构建表达式; notandorxor的优先级较低,因此它们可用于基本上不同的表达式之间的流量控制。

答案 3 :(得分:10)

“&&”和“||”运营商的优先级高于“和”,“或”对手。