为什么Perl的逻辑运算符&&,|| ,! 优先于和,或,而不是?

B C*_*hen 12 perl

这可能是一个小点,但我想知道为什么Perl的逻辑运算符(&&,||,和!)优先于易于理解的"英语"逻辑运算符(and,ornot).使用前一组是否有任何优势,以及在脚本中使用后一组的任何缺点?

Jon*_*ler 23

原来&&,||!运营商的高优先级相匹配的C语言.

较新的(但仍然大)and,ornot加入运营商简化一些常见的结构.例如,比较:

open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
Run Code Online (Sandbox Code Playgroud)

第一个是不正确的; 高优先级||绑定,$filenamedie不是你想要的.第二个是正确的; 低优先级or意味着缺少的括号不会导致歧义.

  • +1因为这是Larry Wall在*Programming Perl*中提供的实际原因. (5认同)

ike*_*ami 13

如果||并且or具有相同的优先权,那么

return some_func $test1 || $test2;
Run Code Online (Sandbox Code Playgroud)

意思是

return some_func($test1) || $test2;
Run Code Online (Sandbox Code Playgroud)

代替

return some_func($test1 || $test2);
Run Code Online (Sandbox Code Playgroud)

要么

some_func $test1 or die;
Run Code Online (Sandbox Code Playgroud)

意思是

some_func($test1 or die);
Run Code Online (Sandbox Code Playgroud)

代替

some_func($test1) or die;
Run Code Online (Sandbox Code Playgroud)

这些变化都不可取.

虽然人们可以or更容易地理解辩论||,但是阅读起来更难.当运算符看起来不像它们的操作数时,更容易读取代码.