- ベストアンサー
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"; #表示されない。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
for(@ar) のループ内では、グローバル変数 $_ で@ar の内容がひとつずつ変更可能です。 このため、そのループ内で while (<IN>) を使ってしまうと、$_ の中身が<IN> の内容に変わってしまうのだと思います。 解決としては、 for(@ar) を、foreach $item (@ar) { ~のようにするか、 または、 while(<IN>) を while($line = <IN>) のようにするとかだとおもいます。 perl の暗黙の変数ってのは思いもかけないところで影響があるから厄介ですよね。
お礼
早速お答えありがとうございます。 ということは、$_はリストの値が代入されるのではなく、ポイントしているだけなんですね。 質問後にいろいろ試してみて、whileブロックをコメントアウトすると正常に動作するので、whileが関係している事まではわかったのですが、そういう事だったのですか。 勉強になりました。ありがとうございます。