- ベストアンサー
while (<STDIN>) {・・} の意味。
while(<STDIN>){ ・・・ } の場合、ファイルの終わりに来ると whileループを抜けます。 しかし、ここで疑問があります。 <STDIN>はファイルの終わりに来ると undef を返しますよね? しかし、結城浩さんによると、 「Perlでは(undef)は真」となっています。 http://d.hatena.ne.jp/hyuki/20060406#undef すると、上記のループは本来終わらないはずでは、 と思ってしまうのですが・・・。 何が間違っているのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ついでに補足しておくと >「Perlでは(undef)は真」 は、 「Perlでは undef は真」 の意味ではありません。 サイトでも説明されている通り、 @array = undef ; は、 @array = (undef) ; の様に評価されるということです。 これは、 $array[0] = undef; の意味です。 その時 @array をスカラーで評価すると、要素数になるので、 要素数:1、で真になります。 サイトの例で sub foo { return undef; } とされていますけど(もちろんわざと) こういう返値が配列に代入されることが予想される場合 return wantarray ? : () : undef; とすべきです。 これなら問題ないです。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
Perl では、undef は、偽です。 というか、 undef は、 数値として評価をすると0 文字列として評価をすると'' #空文字列 になり、0及び空文字列は、偽です。 ついでに ( ) # 空リストも偽です。 質問文のサイトでもそのことははっきりしています。 while(undef){ } では、ブロックが実行されないのは、質問文のサイトでも示されています。 ただ、問題となるのは、 @array = (); if(@array){ #実行されない } ですが、 @array = undef; if(@array){ #実行される } ということについて書かれています。
お礼
すごく納得しました! ありがとうございます。