• ベストアンサー

forの中にリストを書くとその後の動作がおかしくなります。

パールの初心者です。 こんなプログラムを作ってみたのですが、 @arの要素数だけ処理をしたいのですが、 処理後@arを使った配列が参照できなくなります。 理由が良くわかりません。 どなたかご教授願います。 $ar[0]=[1,2,3]; $ar[1]=[4,5,6]; print "@{$ar[0]}\n"; #表示される。 for(@ar){ #これが悪いみたい。 open(IN,'test.pl'); while(<IN>){ } close(IN); } print "@{$ar[0]}\n"; #表示されない。

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

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

for(@ar) のループ内では、グローバル変数 $_ で@ar の内容がひとつずつ変更可能です。 このため、そのループ内で while (<IN>) を使ってしまうと、$_ の中身が<IN> の内容に変わってしまうのだと思います。 解決としては、 for(@ar) を、foreach $item (@ar) { ~のようにするか、 または、 while(<IN>) を while($line = <IN>) のようにするとかだとおもいます。 perl の暗黙の変数ってのは思いもかけないところで影響があるから厄介ですよね。

animaro
質問者

お礼

早速お答えありがとうございます。 ということは、$_はリストの値が代入されるのではなく、ポイントしているだけなんですね。 質問後にいろいろ試してみて、whileブロックをコメントアウトすると正常に動作するので、whileが関係している事まではわかったのですが、そういう事だったのですか。 勉強になりました。ありがとうございます。

関連するQ&A

専門家に質問してみよう