- ベストアンサー
ファイルの書き込み
以下のことがしたいです。 testフォルダよりテキストファイル達を読み込み、 ある行だけ取り除いたのちnewtestフォルダに書き出したいと思います。 以下、コードになります。 #!/usr/bin/perl $n_dir = "newtest/"; $b_dir = "test/"; opendir(DIR, $b_dir); while($file = readdir(DIR)){ $nfile="$n_dir$file"; $bfile="$b_dir$file"; if (-T $bfile) { open(IN, $bfile); #testフォルダよりファイルの読み込み @list = <IN>; close(IN); open(OUT,">$nfile"); #newtestフォルダに書き出し while(@list = <IN>) { #testフォルダ内のファイルを一行ずつ読み込み if (@list =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し print OUT @list; } } close(OUT); } else{next;} } closedir(DIR); ということをやりたいのですが、 書き出されるファイルは空です。 どこが間違っているのでしょうか。 エラーなどは特にありません。 testフォルダのファイル達が そのままnewtestフォルダに書き出されるのですが、 中身は空です。 ご協力お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ついでに、もうひとつ while(@list = <IN>) @listは配列になってしまいますよね?「testのある行だけskip」なら、この配列から1行単位で取り出して、その行をチェックすることになると思います。 @list = <IN>; foreach $line (@list) { if ($line =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し print OUT $line; } } あ、書いちゃった・・。でもPerlは普段書いていないからミスがないかチェックしてくださいね(汗
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
>配列の検索はできないのですね。。。 ある配列で、ある条件を満たす(満たさない)要素だけ取り出したい/取り除きたいということなら grep という関数が使えますよ。 >if (@list =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し test というのが含まれるものだけ残すというのであれば、 @filterd = grep {/test/} @list; という感じです。 一度にフィルタリングしてしまうか、1行1行チェックしながら 出力するかどうかはまあ好みの問題ですのでお好きに。 #細かいこというとメモリの使用量とかありますけどね。
お礼
ありがとうございます! 試してみます。
- sakusaker7
- ベストアンサー率62% (800/1280)
if (-T $bfile) { open(IN, $bfile); #testフォルダよりファイルの読み込み @list = <IN>; close(IN); ↑これで、ファイルの内容を @list に取り出して、IN もcloseしちゃってるのに while(@list = <IN>) { #testフォルダ内のファイルを一行ずつ読み込み はいかんでしょう。 @list はここで空になってしまうので、出力に何も出てこない。 という結果になっているわけです。 あと if (@list =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し これも期待通りには動きません。
お礼
本当ですね。 空のわけです。 ご回答ありがとうございました。 配列の検索はできないのですね。。。
- shimix
- ベストアンサー率54% (865/1590)
デバッグの手順として、 if (@list =~ /test/) { #行にtestという文字列があるぎょうだけ書き出し print OUT @list; } このifを外して print OUT @list; だけにしたら、全部書き出されるかどうかを確認してください。それで書き出されれば (@list =~ /test/) について「だけ」考えればいいです。
お礼
一配列一行だと思ってました! ご回答ありがとうございました。 試してみます!