プロが教える店舗&オフィスのセキュリティ対策術

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の一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。

A 回答 (3件)

perlでは、テキストの読み込みの際に参照する「行区切り」を指定する変数 "$/"があります。


質問文の方法のように1回読み込みを行うとファイルの先頭から行区切りまでを1行として読み込みます。
一度にファイル全体を読み込むには、"$/"にundefをセットします。

$/ = undef;

なお、$/に別の文字を代入するとその文字が行区切り文字とみなされます。

$/ = 'a' # 'a'という文字まで読み込むようになる
    • good
    • 0
この回答へのお礼

有難うございます。意味合いを調べてみて、教えていただいた方法も勉強してみようと思います。

お礼日時:2007/01/31 07:23

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」などとした方が悪い癖が付かなくて良いと思います。
    • good
    • 0
この回答へのお礼

有難うございます。おかげさまで解決することが出来ました。

お礼日時:2007/01/31 07:22

<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: $!";

補足日時:2007/01/30 00:54
    • good
    • 0
この回答へのお礼

有難うございます。出来ました。

お礼日時:2007/01/30 00:41

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