• ベストアンサー

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; }

質問者が選んだベストアンサー

  • ベストアンサー
  • iyomante
  • ベストアンサー率60% (14/23)
回答No.1

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カッコ

ofu-
質問者

お礼

丁寧に教えてくださってありがとうございます。 やりたいことができました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

古いファイルに拡張子をつけて、内容を更新するというのじゃだめですか? それでよいなら 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() で作ってます。

ofu-
質問者

お礼

-piというのがあるのですね。 参考になりました。 ありがとうございます。

関連するQ&A