Почему я должен указать переключатель-i с резервным расширением при использовании ActivePerl?

Я не могу заставить оперативные остроты 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 работает обработка, но создает нежелательный файл резервной копии в процессе.

Существует ли путь вокруг этого?

23
задан Joel Coehoorn 7 December 2011 в 19:19
поделиться

1 ответ

Это ограничение 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
33
ответ дан 29 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: