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

时间:2013-03-04 01:49:24

标签: perl

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

4 个答案:

答案 0 :(得分:22)

原始&&||!运算符优先匹配C语言。

添加了较新的(但仍旧的)andornot运算符以简化一些常见构造。例如,比较:

open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";

第一个是不正确的;高优先级||$filenamedie绑定,这不是您想要的。第二个是正确的;低优先级or意味着缺少的括号不会导致含糊不清。

答案 1 :(得分:13)

如果||or具有相同的优先级,那么

return some_func $test1 || $test2;

意味着

return some_func($test1) || $test2;

而不是

return some_func($test1 || $test2);

some_func $test1 or die;

意味着

some_func($test1 or die);

而不是

some_func($test1) or die;

这些改变都不可取。

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

答案 2 :(得分:-1)

逻辑优先级和清晰性

虽然我不知道这是否是使它们成为该语言的原因,但是它们对于编写清晰的代码非常有用,

## Some sample data...
my ($foo, $bar, $baz) = (0,1,1);

## Different results..
say ( $foo && $bar || $baz );
say ( $foo and $bar || $baz );

即使使用\n,我们也可以在代码中使用它。不需要嘈杂的食物。

## When would you use this...
if (
  $cache->is_outdated
  and $db_master->has_connection || $db_slave->has_connection
) {
  $cache->refresh
}

否则必须是

  $cache->is_outdated
  && ( $db_master->has_connection || $db_slave->has_connection )

但是,perl不喜欢其他语言强加给用户的所有线噪声。

答案 3 :(得分:-3)

将评论转换为答案:

如果这些操作符的优先级相同,则没有必要保留两个版本 - 只有一个版本就足够了。

但拉里沃尔是一名语言学家,他真的很喜欢在他的新语言中使用简单的英语单词。所以,他介绍了这些英国式的运营商(以及unless和其他人)。

为了保持C风格的操作符及其经典含义,他需要使新的关键字不是多余的。因此,他为这些操作员分配了略微不同的含义,他更喜欢。所以差异结果是运营商优先。