2011-10-03 9 views
12

これは一般的なコード例です。なぜPerlは-1が真だと思いますか?

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

これは 'foo'を永遠に印刷します。

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以来1よりも真である可能性が高い(111..111bを)言うことができるゼロ(000..000b)のビット単位の否定です。 BASICとGW-BASICは真の値を返す必要があるときに-1を使用しました。

に関係なく、「空」または「無」を意味する値はfalseであると判断されました。ほとんどの言語も同様の見方をしています。具体的には、整数ゼロ、浮動小数点数ゼロ、文字列ゼロ、空文字列およびundefはfalseです。

これは​​ですが、ドキュメンテーションの言葉の意味はよくありません。 (()の値はfalseですが、そのような値はありません)

このアプローチをとることは非常に便利です。例えば、それは1つが代わりにPerlがawkCからこの行動を取った

if (@x != 0) 
+1

リスト・コンテキストには、空のリストの値があり、 'if(($ x)=()){#false'を比較して' if(($ x)=(undef)){#true'と 'どちらの場合も、 '$ x'はundefに設定されていますが、式の真理は、それらの要素の値ではなく、リスト内の要素の数によって決まります。 –

+1

@ Ven'Tatsu、いいえ、ありません。投稿したコードは '()'の戻り値ではなく、代入の戻り値をテストします。 – ikegami

+1

@ Ven'Tatsu、好奇心が強い場合には、スカラーコンテキストでのリストの割り当ては、RHSによって返される要素の数を返します。例えば'($ x)=(4,5));' '2 'を出力し、' 'scalar(($ x)=());' '0'を出力します。 – ikegami

19

を与えます。 0は常にfalse

+2

これはあなたの答えです。 –

+3

これらの答えは同語学的です。私はこれが本当かどうか尋ねていない、私はそれを見ることができます。問題はなぜこれが本当であるかということです。私はこれを投稿する前にいくつかの記事を見て、実際には、この事実は私が見ることができることは言及されていません。正の整数はすべて通常与えられる例です。 – shigeta

+2

11 upvotes .. =)それは最も大きな評判の報酬を与える本当に簡単な答えです。 – TLP

4

0の整数のみが偽とみなされます。他のゼロ以外の整数は真とみなされます。

+3

'' ''は、ゼロでもなく真でもない何かを返します。 – ikegami

+0

私はもちろん整数について話しています。私は自分の投稿を更新しました。 – Kirk

2

任意の整数<> 0です。 0は常にfalseです。 perldoc perlsyn (Truth and Falsehood)から

+1

ゼロであるが真:perl -E 'say "0e0"? "True": "False" '文字列と数字の間に厳密な型指定システムを持たない言語で区別する必要があります。 0e0は数値でもよいし、文字列(ゼロに評価さえする)でもかまいません(eのために真の文字列になります)。時折混乱する小さな点。 – DavidO

+1

@DavidO、Trueですが、 '' 0e0 "'はCSの意味で整数を返しません。 – ikegami

16

番号0、文字列 '0' と ''、空のリスト()、およびundefを はブールコンテキスト内のすべての偽です。その他の値はすべてtrueです。

-1とみなされます。

+0

ブール値のコンテキストでリストをテストするとき、私は実際にスカラーコンテキストでそれを暗黙的にテストしていると考えています。リストに最初にスカラー処理を行わないブール値のコンテキスト評価があるのは本当ですか? –

+0

これは質問に答えません。 – reinierpost

+0

@Joel:おそらく、混乱を避けるために、空のリストがちょうど言及されています。スカラーコンテキストでは、空の配列は '0'(要素の数)と評価され、空のリストは' undef'(最終要素)と評価されます。両方とも既に偽です。 –

4

質問はです。なぜperlは-1が真だと思いますか?

答えは、特定の値がfalseと評価されると判断されたperlが開発されたときです。これらは次のとおりである:

  • undefを
  • '' 私は理由のような適当な答えを考えることができるすべてである(空の文字列)

。それはちょうどそのように設計されました。

1

if (@x) 

を使用することができます。

なぜCであるか説明されていますhereです。

関連する問題