C风格的运算符&&
,||
,...和它们的Perl人类可读版本“and
”,“or
”之间有什么区别,......?
似乎互联网代码使用它们:
open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
答案 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)
!
,&&
,||
和^
具有高优先级,因此它们可用于构建表达式; not
,and
,or
和xor
的优先级较低,因此它们可用于基本上不同的表达式之间的流量控制。
答案 3 :(得分:10)
“&&”和“||”运营商的优先级高于“和”,“或”对手。