1

私はこれまでこれを行ってきましたが、まだ機能していません。

open (GOOD_FILE,"<$pre.XXX.XXX$post") or die "Cannot open XXX";

# temporarily undefine the input line separator to read the entire file at once:
my $text = do { local $/; <GOOD_FILE> };
close GOOD_FILE or die $!;
#File name to replace XXXX.XXXXX.XXXX.XXXX.CCCC where last CCCC can be     anything 
$text =~ s/^(.*\n)?XXXX\.XXXX\.XXXX\.[^\n]*/$1myname/s;

open (GOOD_FILE,"<$pre.XXXX.XXXX$post") or die "Cannot open XXXX";
print GOOD_FILE $text;
close GOOD_FILE or die $!;

入力ファイルは次のようになります。

I am tester testing
I am still learning.
XXXX.XXXX.XXXX.XXXX.CCCC
I am tester.
XXXX.XXXX.XXXX.XXXX.PPPP

次の出力が生成されます。

I am tester testing
I am still learning.
XXXX.XXXX.XXXX.XXXX.CCCC
I am tester.
myname.

しかし、私は空のファイルを取得しています。

みんなありがとう、私は何を置き換えるかで変数を使用して問題を解決することができました私は変数として正規表現しました、そしてそれはうまくいきました。

4

1 に答える 1

3

モードで書き込み用にファイルを開く>と、自動的に長さが 0 に切り捨てられます。

モードを使用して、ファイルを切り捨てずに読み取りと書き込みの両方のために同時に開くことは可能ですが、実際にそのようなファイルを変更するには、 seek+<が必要なため少し注意が必要です。

代わりに、目的を達成するための 2 つの簡単な方法があります。ファイルが常に比較的短いことがわかっている場合は、メモリに読み込んで変更し、書き戻すことができます。

my $filename = 'filename.txt';

open my $in, '<', $filename or die $!;
# temporarily undefine the input line separator to read the entire file at once:
my $text = do { local $/; <$in> };
close $in or die $!;

$text =~ s/^(.*\n)?MY\.FILE\.NAME\.[^\n]*/$1myname/s;

open my $out, '>', $filename or die $!;
print $out $text;
close $out or die $!;

大きなファイルの場合のもう 1 つの解決策は、出力を一時ファイルに書き込み、完了したら一時ファイルを元のファイルに移動することです。これは多かれ少なかれperl の-iスイッチが行うことであり、任意の長いファイルを 1 行ずつ編集することができます (ただし、コピーを保存するのに十分なディスク容量がある限り)。残念ながら、あなたの場合、ファイル内の特定の文字列の最後の出現を照合することは、この方法を使用して少しトリッキーになります。

( File::ReadBackwardsを使用できると思いますが、残念ながらそれに対応する File:: Write Backwards モジュールはありません (OS ファイル I/O インターフェースの制限により、それを作成するのは非常に困難です)。 「基本的には、出力行を一時ファイルに逆の順序で書き込んでから、2 番目のパスを実行して正しい順序で元のファイルにコピーする必要があります。それは可能ですが、ちょっと複雑です。」

于 2012-12-24T20:43:14.103 に答える