• ベストアンサー

while文がうまく動かない

a.txt a b c b.txt x y z として次のプログラムを実行 open(A,"<a.txt"); open(B,"<b.txt"); while($a=<A>){ while($b=<B>){ print "$a>>>$b<br>"; } } close(A); close(B); すると実行結果が以下のようになりました。 a>>>x a>>>y a>>>z 上の結果だけではなくてa.txtがbの時cの時も出力されるつもりで書いたのですがなぜかaの時しか出力されません。どなたか理由が分る方いませんか? ちなみに Linux FedoraCore2 perl5 を使用しています。

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

  • ベストアンサー
  • masaboo
  • ベストアンサー率58% (7/12)
回答No.2

open(A,"<a.txt"); while($a=<A>){   open(B,"<b.txt");   while($b=<B>){     print "$a>>>$b<br>";   }   close(B); } close(A); なのでは?

--KING--
質問者

お礼

できました。ありがとうございました。

その他の回答 (2)

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.3

open(B,"<b.txt"); を最初のwhileループの内側に移動してください。 open(A,"<a.txt"); while($a=<A>){ open(B,"<b.txt"); while($b=<B>){ print "$a>>>$b<br>"; } } 今回のとは関係有りませんが、変数$a,$bはsortの時に使われる変数なので、通常スクリプトを書く時に使うとuse strictしていてもミスに気づきづらくなります。できればさけた方が無難でしょう。

--KING--
質問者

お礼

できました。ありがとうございました。

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

原因は B が A の1回目のループでEOFまで達してしまうからです。 A の2回目のループで B から取得しようとしても EOF なので何も取得できず終了しています。 対処としては B のループが終わったあとにファイルポインタを先頭に戻す必要があります。 open(A,"<a.txt"); open(B,"<b.txt"); while($a=<A>){  while($b=<B>){   print "$a>>>$b<br>";  }  seek(B,0,0); } close(A); close(B);

--KING--
質問者

お礼

ご回答ありがとうございました。

専門家に質問してみよう