2014-03-05 15 views
5
7 foreach (@crons) { 
    8  unless (index($_, "cks") != -1) { 
    9   unless (index($_, "aab") != -1) { 
10    unless (index($_, "lam") != -1) { 
11     push (@found, $_); 
12    } 
13   } 
14  } 
15 } 

怎麼來的上述不給輸出以下相同:perl嵌套除非聲明不等於使用&&?

7 foreach (@crons) { 
    8  unless (index($_, "cks") != -1 && index($_, "aab") != -1 && index($_, "lam") != -1) { 
    9   push (@found, $_); 
10  } 
11 } 

@crons具有字符串列表,我試圖讓不具有「中正」的所有字符串「 AAB」和‘林’

的第一部分代碼我想要做什麼,但第二次犯規,並在我的腦海裏,它應該...
任何人都關心解釋爲什麼他們是不一樣的,也不爲什麼它不給相同的輸出?

+4

'foreach(@crons){push @found,$ _ if!/cks/&&!/aab/&&! /我是/; ''更清晰易讀。 – Zaid

+2

或者(感謝[de Morgan's law](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)):'for(@crons){push @found,$ _除非/ cks /或/ aab /或/ lam /; }' – Zaid

回答

10

讓我們打電話給您的條件AB,C。我們現在有代碼

unless (A) { 
    unless (B) { 
    unless (C) { 

unless可以非常混亂,所以我們把它寫只用if

if (!A) { 
    if (!B) { 
    if (!C) { 

現在我們&&這些條件在一起:

if (!A && !B && !C) { 

這也可以寫成

if (not(A || B || C)) { 

這等同叫當你測試字符串'cks'de Morgan's law

+2

精美的解釋。 '(!A &&!B &&!C)!=!(A && B && C)' – Zaid

+4

...因此,它可以寫成'除非(A || B || C){'。但你不敢。 – ikegami

+0

@ikegami這被認爲是不好的做法? –

1

兩種邏輯的非等價變得清晰。

第一個邏輯將評估爲false,第二個邏輯將評估爲true,因爲它不包含字符串'aab''lam'