2013-03-04 72 views
11

這可能是一個小點,但我想知道爲什麼Perl的邏輯運算符(&&||!)優先於易於理解的「英語」邏輯運算符(andornot)。使用前一組和使用後一組的缺點是否有利於腳本?爲什麼Perl的邏輯運算符&&,||,!優先於,或,而不是?

+0

因爲Larry Wall喜歡那樣嗎? – mvp 2013-03-04 01:51:11

+1

如果它們的偏好相同,則不需要保留兩個版本 - 只有一個版本可以保留。由於拉里是一位語言學家,並且喜歡在他的新語言中使用簡單的英語單詞,所以他介紹了這些內容(除非另有說明)。當然,他給這些詞賦予了意義,他更喜歡(並且與C風格的操作員不同) – mvp 2013-03-04 02:44:49

回答

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||更容易理解,但它很難閱讀。當操作員看起來不像操作數時,讀代碼更容易。

21

原來的&&,||!運算符的優先級高,以匹配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

-3

轉換評論一個答案:

如果這些經營者在偏好相同,那就沒有必要保留兩個版本 - 只有一個版本就足夠了。

但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