- ベストアンサー
perlでファイル内の文字列を置換して新たなファイルに出力
3つのファイル(list1,list2,list3)を順番に読み込んで ファイルの中のGoodという文字をBadにして 新たにlist1_new、list2_new、list_3new という名前のファイルに書き込みたいのですが やり方がわかりません。 下記のプログラムを ベースに教えていただけませんか? #! /usr/local/bin/perl foreach LIST ( \ list1 \ list2 \ list3 \ ) open(FILE , "${LIST}" ) || die Damedame; while (<FILE>) { s/Good/Bad/g ; print; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
foreach $LIST ( # $付ける list1, # カンマ list2, list3 ) { # foreachカッコ open(FILE2 , ">${LIST}_new" ) or die Damedame2; # 出力用ファイルオープン open(FILE , "${LIST}" ) or die Damedame; while (<FILE>) { s/Good/Bad/g ; print FILE2 $_; # 出力処理 } close(FILE); # クローズ close(FILE2); # クローズ } # foreachカッコ
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
古いファイルに拡張子をつけて、内容を更新するというのじゃだめですか? それでよいなら perl -pi.bak -e 's/GOOD/BAD/g' 対象のファイル とかですんじゃうんですが。 _newをつけるのがどうしても良いのだというなら use strict; foreach my $file qw(list1 list2 list3) { my $newfile = $file . "_new"; my $ofh; my $ifh; unless (open($ifh, '<', $file)) { warn "can't open file $file $!\n"; next; } unless (open($ofh, '>', $newfile)) { warn "can't open file $newfile $!\n"; close $ifh; next; } while (<$ifh>) { s/GOOD/BAD/og; print $ofh $_; } close $ofh; close $ifh; } こんな感じで。 どれかのファイルで失敗しても後続のファイルを処理するようにしてます。 あと bareword はあまり使うべきでないのでリストは qw() で作ってます。
お礼
-piというのがあるのですね。 参考になりました。 ありがとうございます。
お礼
丁寧に教えてくださってありがとうございます。 やりたいことができました。