アプリ版:「スタンプのみでお礼する」機能のリリースについて

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
を使用しています。

A 回答 (3件)

open(A,"<a.txt");


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

なのでは?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/26 16:08

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していてもミスに気づきづらくなります。できればさけた方が無難でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/26 16:08

原因は 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);
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/01/26 16:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!