为什么Perl的逻辑运算符&&,||,!优先于,或,而不是?
这可能是一个小点,但我想知道为什么Perl的逻辑运算符(&&
,||
和!
)优先于易于理解的“英语”逻辑运算符(and
,or
和not
)。使用前一组和使用后一组的缺点是否有利于脚本?为什么Perl的逻辑运算符&&,||,!优先于,或,而不是?
如果||
和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
比||
更容易理解,但它很难阅读。当操作员看起来不像操作数时,读代码更容易。
原来的&&
,||
和!
运算符的优先级高,以匹配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,因为这是Larry Wall在编程Perl *中给出的实际原因。 – 2013-03-04 03:01:31
转换评论一个答案:
如果这些经营者在偏好相同,那就没有必要保留两个版本 - 只有一个版本就足够了。
但Larry Wall是一位语言学家,他非常喜欢在他的新语言中使用简单的英语单词。于是,他介绍了这些英文风格的运营商(与unless
等一起)。
为了保持C风格的操作符及其经典含义,他需要使新的关键字不是多余的。正因为如此,他给这些运营商赋予了稍微不同的含义,他更喜欢。所以这种差异变成了运营商的优先权。
这不是事实:这与拉里对英语单词的偏爱毫无关系。除了'&&'和'||'之外,''和'和'or'纯粹是为了给相同的运算符提供较低的绑定优先级。它们在Perl中特别有用,因为函数调用不需要参数周围的括号。 – Borodin 2013-03-04 03:04:40
这不就是我说的吗?如果它们的优先级相同,'和'和'或'今天就不存在了。而英式风格的结构确实提供了更大的灵活性,我不是在争辩,要么 – mvp 2013-03-04 03:06:55
不,这不是你说的。 *“[拉里沃尔]真的很喜欢在他的新语言中使用简单的英语单词,因此,他介绍了这些英语风格的操作员......他需要使新的关键字不会冗余\ \ [他\]分配略有不同的含义他更喜欢的运营商。“*是童话废话。 – Borodin 2013-03-04 03:23:43
因为Larry Wall喜欢那样吗? – mvp 2013-03-04 01:51:11
如果它们的偏好相同,则不需要保留两个版本 - 只有一个版本可以保留。由于拉里是一位语言学家,并且喜欢在他的新语言中使用简单的英语单词,所以他介绍了这些内容(除非另有说明)。当然,他给这些词赋予了意义,他更喜欢(并且与C风格的操作员不同) – mvp 2013-03-04 02:44:49