0

ファイルへのファイル ハンドラーがあり、一致する行を探して、一致する行を新しい行に置き換えています。行の置換はサブルーチンで行われます。

sub replace{
   seek(FILE,0,0);
   while(my $line= <FILE>){
       if($line =~ m/SOMEMATCH/){
            $line=~ s/SOMEMATCH/REPLACEMENT/;
            print FILE $line;
       }
    } 
}

&replace を呼び出した後にファイルを印刷すると、間違った行が次のように変更されていることがわかりました。

Line 1
Line 2
Line 3
SOMEMATCH
Line 4
Line 5

になります:

Line 1
Line 2
Line 3
SOMEMATCH
REPLACEMENT
Line 5

どうしたの?どうすれば修正できますか?

4

1 に答える 1

2

テキスト ファイルを読み込んで、その一部をその場で長いまたは短い文字列に置き換えて、必要な結果を得ることはできないと思います。より長い新しい文字列によって一部のデータを上書きする必要があります。そうしないと、文字列が短い場合に「穴」が残ります。文字列がたまたま同じ長さである場合、ロジックにはまだ問題があります。文字列を読み取った後に置き換えたい文字列を過ぎているため、文字列を置き換えるにはバックアップする必要があります。その時点で置換を書き込むと、次の行を上書きする必要があります。これは、現在、ファイルの「ポインター」が次の行を読み取る準備ができている場所に設定されているためです。

このようなことは、別の出力ファイルを用意することで行うのが最善だと思います。1 つを読み取り、もう 1 つを書き込み、必要に応じて最初のものを削除し、2 つ目の名前を変更します。

または、ファイル全体を配列に読み取り、文字列を置換し、上書きのためにファイルを閉じて再度開き、配列をファイルに書き戻して、ファイルを閉じることができます。

于 2012-09-03T04:41:21.263 に答える