这可能是一个小问题,但我想知道为什么 Perl 的逻辑运算符(&&
、、||
和!
)优先于易于理解的“英语”逻辑运算符(and
、or
和not
)。在脚本中使用前一组有什么好处,而使用后一组有什么缺点吗?
问问题
6775 次
4 回答
24
原始的&&
,||
和!
运算符是匹配 C 语言的高优先级。
添加了较新的(但仍然是旧的)and
和or
运算not
符以简化一些常见的结构。例如,比较:
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
其中第一个是不正确的;高优先级||
绑定,$filename
这die
不是你想要的。第二个是正确的;低优先级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 回答