C风格的运算符&&&,||,…和它们的Perl人类可读版本“和”,“或”,…之间有什么区别?
看来,互联网代码使用它们:
open (FILE,$file) or die("cannot open $file"); open (FILE,$file) || die("cannot open $file");
解决方法
来自Perl Doc ..
> OR
这是列表运算符。在列表运算符的右侧,它具有非常低的优先级,以便它控制在那里找到的所有逗号分隔的表达式。唯一具有较低优先级的运算符是逻辑运算符“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