Я не могу заставить оперативные остроты Perl редактирования, работающие под ActivePerl работать, если я не указываю их с резервным расширением:
C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt
Can't do inplace edit without backup.
Та же команда с -i.bak
или -i.orig
работает обработка, но создает нежелательный файл резервной копии в процессе.
Существует ли путь вокруг этого?
Это ограничение Windows / MS-DOS. Согласно perldiag :
Вы работаете в такой системе, как MS-DOS, которая сбивается с толку, если вы пытаетесь читать из удаленного (но все еще открытого) файла. Вы должны сказать -i.bak или что-то в этом роде.
Реализация Perl -i
заставляет его удалить file1.txt
, сохранив его открытый дескриптор, а затем заново создать файл с тем же именем. Это позволяет вам «читать» file1.txt, даже если он был удален и создается заново. К сожалению, Windows / MS-DOS не позволяет удалить файл, к которому прикреплен открытый дескриптор, поэтому этот механизм не работает.
Лучше всего использовать -i.bak
, а затем удалить файл резервной копии. Это, по крайней мере, дает вам некоторую защиту - например, вы можете отказаться от удаления резервной копии, если perl
завершится с ненулевым кодом выхода. Что-то вроде:
perl -i.bak -ape "splice...." file1.txt && del file1.bak