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

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

问题描述:

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

+0

因为Larry Wall喜欢那样吗? – mvp 2013-03-04 01:51:11

+1

如果它们的偏好相同,则不需要保留两个版本 - 只有一个版本可以保留。由于拉里是一位语言学家,并且喜欢在他的新语言中使用简单的英语单词,所以他介绍了这些内容(除非另有说明)。当然,他给这些词赋予了意义,他更喜欢(并且与C风格的操作员不同) – mvp 2013-03-04 02:44:49

如果||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,ornot运算符被添加以简化一些常见构造。例如,比较:

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

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

+5

+1,因为这是Larry Wall在编程Perl *中给出的实际原因。 – 2013-03-04 03:01:31

转换评论一个答案:

如果这些经营者在偏好相同,那就没有必要保留两个版本 - 只有一个版本就足够了。

但Larry Wall是一位语言学家,他非常喜欢在他的新语言中使用简单的英语单词。于是,他介绍了这些英文风格的运营商(与unless等一起)。

为了保持C风格的操作符及其经典含义,他需要使新的关键字不是多余的。正因为如此,他给这些运营商赋予了稍微不同的含义,他更喜欢。所以这种差异变成了运营商的优先权。

+0

这不是事实:这与拉里对英语单词的偏爱毫无关系。除了'&&'和'||'之外,''和'和'or'纯粹是为了给相同的运算符提供较低的绑定优先级。它们在Perl中特别有用,因为函数调用不需要参数周围的括号。 – Borodin 2013-03-04 03:04:40

+0

这不就是我说的吗?如果它们的优先级相同,'和'和'或'今天就不存在了。而英式风格的结构确实提供了更大的灵活性,我不是在争辩,要么 – mvp 2013-03-04 03:06:55

+1

不,这不是你说的。 *“[拉里沃尔]真的很喜欢在他的新语言中使用简单的英语单词,因此,他介绍了这些英语风格的操作员......他需要使新的关键字不会冗余\ \ [他\]分配略有不同的含义他更喜欢的运营商。“*是童话废话。 – Borodin 2013-03-04 03:23:43