2011-10-03 182 views
12

這是一塊普通的例子的代碼:爲什麼Perl認爲-1是真的?

while (1) { 
    print "foo\n"; 
} 

其中打印「富」永遠。

perl foo.pl 
foo 
foo 
foo 
... 

while (0) { print "foo\n"; } 

悄然而逝,你希望:

perl test.pl 

有人可以解釋爲什麼這是同時的一個有用的執行?這適用於5.10至少,Unix和MacOS X系統:

while (-1) { print "foo\n"; } 

這給

foo 
foo 
foo 
... 
+12

'-1'在許多語言中被認爲是真正的價值。 – Quentin

+5

在Perl中,0是錯誤的;任何不是虛假的都是真實的。 –

+4

我很好奇導致這個問題的原因。有沒有一種語言認爲-1錯誤? – ikegami

回答

18

如果有什麼事情,可以說是-1更有可能比1是真實的,因爲-1111..111b)是零(000..000b)按位否定。 BASIC和GW-BASIC在需要返回真值時使用-1。

無論如何,Perl認爲意味着「空」或「無」的值是錯誤的。大多數語言都有類似的觀點。具體而言,整數零,浮點數零,字符串零,空字符串和undef都是假的。

這是​​,雖然文檔措辭不佳。 (它列出了()作爲一個假的值,但沒有這個值。)

除了一致性,採用這種方法非常有用。例如,它允許使用的

if (@x) 

代替

if (@x != 0) 
+1

在列表上下文中有一個空列表的值,比較if(($ x)=(undef)){#true'與if(($ x)=()){#false'。在這兩種情況下,$ x都被設置爲undef,但表達式的真值由列表中元素的數量決定,而不是由這些元素的值決定。 –

+1

@ Ven'Tatsu,不,沒有。你發佈的代碼測試了賦值的返回值,而不是'()'的返回值。 – ikegami

+1

@ Ven'Tatsu,如果您好奇,標量上下文中的列表賦值返回RHS返回的元素數。例如'說標量(($ x)=(4,5));'打印'2'和'說標量(($ x)=());'打印'0')。 – ikegami

19

每一個非零整數計算爲true。 0總是false

+2

這是你的答案。 –

+3

這些答案是重複的。我不是在問這是否屬實,我可以看到。問題是爲什麼這是真的。在我發佈這篇文章之前,我看了幾篇文章,其實並沒有提到我可以看到的事實。正整數都是通常給出的例子。 – shigeta

+2

11 upvotes .. =)這是真正簡單的答案,給予最大的聲譽獎勵。 – TLP

4

只有一個0整數被認爲是錯誤的。任何其他非零整數被認爲是真的。

+3

不正確。 ''「'返回既不爲零也不爲真的東西。 – ikegami

+0

我正在談論整數當然。我更新了我的帖子。 – Kirk

2

任何整數<> 0爲真。 0總是錯誤的。

+1

零但真:perl -E'說「0e0」? 「True」:「False」'必須區分字符串和數字之間沒有嚴格的鍵入系統的語言。 0e0可以是一個數字,它可以是一個字符串(甚至計算爲零),它可以是一個真正的字符串(因爲e)。偶爾混淆的一個小問題。 – DavidO

+1

@DavidO,True,但'「0e0」'不返回CS意義上的整數。 – ikegami

16

perldoc perlsyn (Truth and Falsehood)

數字0,字符串 '0' 和 '',空列表(),和民主基金 是在布爾上下文全是假的。其他所有值都是正確的。

-1被認爲是正確的。

+0

我一直認爲,當在布爾上下文中測試一個列表時,我真的隱式地在標量上下文中測試它,當空值給出零時,它就是錯誤的。列表是否真的有一個布爾上下文評估,不首先得到標量處理? –

+0

這不回答這個問題。 – reinierpost

+0

@Joel:更可能的是,空列表只是爲了避免混淆。在標量上下文中,一個空數組計算爲'0'(元素數量),空列表計算爲'undef'(它的最後一個元素),這兩個數組都已經是假的,而不需要任何特殊的邏輯來處理它。 –

4

問題是'爲什麼perl認爲-1是真的?'

答案是當perl被開發時,它決定某些值將被評估爲false。它們是:

  • 民主基金
  • ''(空字符串)

這是所有我能想到一個合適的答案爲爲什麼。它只是這樣設計的。

1

的Perl了從awkC此行爲。

爲什麼C是否解釋here