• ベストアンサー

while (<STDIN>) {・・} の意味。

 while(<STDIN>){    ・・・  } の場合、ファイルの終わりに来ると whileループを抜けます。 しかし、ここで疑問があります。 <STDIN>はファイルの終わりに来ると undef を返しますよね? しかし、結城浩さんによると、 「Perlでは(undef)は真」となっています。 http://d.hatena.ne.jp/hyuki/20060406#undef すると、上記のループは本来終わらないはずでは、 と思ってしまうのですが・・・。 何が間違っているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ついでに補足しておくと >「Perlでは(undef)は真」 は、 「Perlでは undef は真」 の意味ではありません。 サイトでも説明されている通り、 @array = undef ; は、 @array = (undef) ; の様に評価されるということです。 これは、 $array[0] = undef; の意味です。 その時 @array をスカラーで評価すると、要素数になるので、 要素数:1、で真になります。 サイトの例で sub foo { return undef; } とされていますけど(もちろんわざと) こういう返値が配列に代入されることが予想される場合 return wantarray ? : () : undef; とすべきです。 これなら問題ないです。

white-tiger
質問者

お礼

すごく納得しました! ありがとうございます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Perl では、undef は、偽です。 というか、 undef は、 数値として評価をすると0 文字列として評価をすると'' #空文字列 になり、0及び空文字列は、偽です。 ついでに ( ) # 空リストも偽です。 質問文のサイトでもそのことははっきりしています。 while(undef){ } では、ブロックが実行されないのは、質問文のサイトでも示されています。 ただ、問題となるのは、 @array = (); if(@array){ #実行されない } ですが、 @array = undef; if(@array){ #実行される } ということについて書かれています。

関連するQ&A