13

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

4

4 回答 4

24

原始的&&,||!运算符是匹配 C 语言的高优先级。

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

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

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

于 2013-03-04T01:53:57.087 回答
14

如果||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比 更容易理解||,但更难阅读。当运算符看起来不像它们的操作数时,更容易阅读代码。

于 2013-03-04T01:58:03.683 回答
-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 不喜欢其他语言强加给用户的所有行噪音。

于 2019-08-26T00:21:01.160 回答
-3

将评论转换为答案:

如果这些运算符的偏好相同,则不必保留两个版本——只有一个版本就足够了。

但拉里沃尔是一位语言学家,他真的很喜欢在他的新语言中使用简单的英语单词。因此,他介绍了这些英式运算符(以及 withunless和其他)。

为了保留 C 风格的运算符及其经典含义,他需要使新关键字不冗余。因此,他对这些他更喜欢的运算符赋予了稍微不同的含义。因此,这种差异原来是运算符优先级。

于 2013-03-04T02:59:08.703 回答