「平成」を感じるもの

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

A 回答 (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カッコ
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/11/05 09:51

古いファイルに拡張子をつけて、内容を更新するというのじゃだめですか?


それでよいなら

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() で作ってます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/05 09:49

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


おすすめ情報