Perl-запрос с использованием -pie - PullRequest
8 голосов
/ 29 октября 2011

Это работает:

perl -pi -e 's/abc/cba/g' hellofile

Но это не так:

perl -pie 's/cba/abc/g' hellofile

Другими словами -pi -e работает, но -pie - нет.Почему?

Ответы [ 3 ]

15 голосов
/ 29 октября 2011

Флаг -i принимает необязательный аргумент (который, если он присутствует, должен быть сразу после него, а не отдельный аргумент командной строки), который указывает суффикс для добавления к имени входного файла для целейсоздание резервной копии.Запись perl -pie 's/cba/abc/g' hellofile приводит к тому, что e принимается в качестве этого суффикса, а поскольку e не интерпретируется как нормальная опция -e, Perl пытается запустить скрипт, расположенный в s/cba/abc/g, что, вероятно, не 'не существует.

9 голосов
/ 29 октября 2011

Поскольку -i принимает дополнительное расширение для файлов резервных копий, например -i.bak, и поэтому дополнительные флаги не могут следовать непосредственно после -i.

С perldoc perlrun

-i [расширение]

указывает, что файлы, обработанные конструкцией <>, должны редактироваться на месте. Это делается путем переименования входного файла, открытия вывода файл с исходным именем, и выбрав этот выходной файл в качестве по умолчанию для операторов print (). Расширение, если оно имеется, используется для измените имя старого файла, чтобы сделать резервную копию, следуя этим правила:

Если расширение не указано, резервное копирование не производится и текущий файл перезаписаны.

Если расширение не содержит *, то оно добавляется в конец текущего имени файла в качестве суффикса. Если расширение содержит один или больше символов *, тогда каждый * заменяется текущим имя файла. В терминах Perl, вы можете думать об этом как:

6 голосов
/ 30 октября 2011

Perl уже говорит вам, почему :) T ry- I t- T o- S ee

$ perl -pie " s/abc/cba/g " NUL
Can't open perl script " s/abc/cba/g ": No such file or directory

Если вы используете B :: Deparse, вы можете увидеть, как Perl компилирует ваш код

$ perl -MO=Deparse -pi -e " s/abc/cba/g " NUL
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Если вы ищете $ ^ I в perlvar, вы можете узнать о ключе -i:)

$ perldoc -v "$^I"

    $INPLACE_EDIT
    $^I     The current value of the inplace-edit extension. Use "undef" to
            disable inplace editing.

            Mnemonic: value of -i switch.

Теперь, если мы вернемся к первой части, добавим дополнительный -e, затем добавим Deparse, объясним ключ -i

$ perl -pie -e " s/abc/cba/g " NUL
Can't do inplace edit: NUL is not a regular file.

$ perl -MO=Deparse -pie -e " s/abc/cba/g " NUL
BEGIN { $^I = "e"; }
LINE: while (defined($_ = <ARGV>)) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Может ли быть так, что e in -pie будет взято какрасширение?Я так думаю

$ perl -MO=Deparse -pilogicus -e " s/abc/cba/g " NUL
BEGIN { $^I = "logicus"; }
LINE: while (defined($_ = <ARGV>)) {
    s/abc/cba/g;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

В случае сомнений Deparse или Deparse, -p

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...