- ベストアンサー
全行読み込むには
open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; print "$f_data1"; print "$f_data2"; select STDOUT; close( OUT ) or die "Can't close word.js: $!"; 上記スクリプトでは、pass.datの一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Perlは行テキスト指向処理なので open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; @A_DATA = <IN>; ## 配列に読み込む:スカラ型だと1行目しか入らない。 close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = join("\n",@A_DATA); ## どうしても全行スカラ型に入れたいなら、各行ごとに好きな記号(ここでは改行)をつけてくっつける。 となります。 また「IN」とはしないで「IN01」などとした方が悪い癖が付かなくて良いと思います。
その他の回答 (2)
- bgbg
- ベストアンサー率53% (94/175)
perlでは、テキストの読み込みの際に参照する「行区切り」を指定する変数 "$/"があります。 質問文の方法のように1回読み込みを行うとファイルの先頭から行区切りまでを1行として読み込みます。 一度にファイル全体を読み込むには、"$/"にundefをセットします。 $/ = undef; なお、$/に別の文字を代入するとその文字が行区切り文字とみなされます。 $/ = 'a' # 'a'という文字まで読み込むようになる
お礼
有難うございます。意味合いを調べてみて、教えていただいた方法も勉強してみようと思います。
- 11th_style
- ベストアンサー率50% (45/90)
<IN>はスカラコンテキストですと1行ずつ結果を返し、読み込める行がなくなるとundef値を返します。よって、 while($f_data = <IN>){ # 繰り返したい処理 } とやると、1行目から最後の行まで処理されます。
お礼
有難うございます。出来ました。
補足
申し訳ございません。よく見直してみましたら、二行目以降は読み込まれるようになったのですが、一行目が読み込まれていませんでした。以下のように変更してみましたが、どこがおかしいのでしょうか? open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; while($f_data = <IN>){ $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; print "$f_data1"; print "$f_data2"; } select STDOUT; close( OUT ) or die "Can't close word.js: $!"; close( IN ) or die "Can't close pass.dat: $!";
お礼
有難うございます。おかげさまで解決することが出来ました。