27

I cannot get in-place editing Perl one-liners running under ActivePerl to work unless I specify them with a backup extension:

C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt
Can't do inplace edit without backup.

The same command with -i.bak or -i.orig works a treat but creates an unwanted backup file in the process.

Is there a way around this?

4

2 に答える 2

36

これは Windows/MS-DOS の制限です。perldiagによると:

MS-DOS などのシステムを使用していて、削除された (まだ開いている) ファイルから読み込もうとすると混乱します。-i.bak などと言う必要があります。

Perl の-i実装ではfile1.txt、開いているハンドルを保持したままファイルを削除し、同じ名前でファイルを再作成します。これにより、file1.txt が削除されて再作成されている場合でも、file1.txt を「読み取る」ことができます。残念ながら、Windows/MS-DOS では、開いているハンドルが添付されたファイルを削除することはできないため、このメカニズムは機能しません。

最善の方法は-i.bak、バックアップ ファイルを使用してから削除することです。これにより、少なくともある程度の保護が得られます。たとえば、perlゼロ以外の終了コードで終了した場合、バックアップを削除しないことを選択できます。何かのようなもの:

perl -i.bak -ape "splice...." file1.txt && del file1.bak
于 2010-04-11T11:55:42.567 に答える