这可能是一个小问题,但我想知道为什么Perl的逻辑运算符(&&
,||
和!
)优先于易于理解的“英语”逻辑运算符( and
,or
和not
)。使用前一组是否有任何优势,以及在脚本中使用后一组的任何缺点?
答案 0 :(得分:22)
原始&&
,||
和!
运算符优先匹配C语言。
添加了较新的(但仍旧的)and
,or
和not
运算符以简化一些常见构造。例如,比较:
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
第一个是不正确的;高优先级||
与$filename
和die
绑定,这不是您想要的。第二个是正确的;低优先级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风格的操作符及其经典含义,他需要使新的关键字不是多余的。因此,他为这些操作员分配了略微不同的含义,他更喜欢。所以差异结果是运营商优先。