Как поместить функциональность perl -pne в скрипт perl - PullRequest
1 голос
/ 21 июня 2010

Так что в командной строке я могу удобно сделать что-то вроде этого:

perl -pne 's/from/to/' in > out

И если мне нужно повторить это и / или у меня есть несколько других преобразований perl -pne, я могу поместить их, скажем, в файл .bat в Windows. Конечно, это довольно окольный способ сделать это. Я должен просто написать один perl скрипт, который имеет все эти преобразования регулярных выражений.

Так как ты это пишешь? Если у меня есть сценарий оболочки, содержащий эти строки:

perl -pne 's/from1/to1/' in > temp
perl -pne 's/from2/to2/' -i temp
perl -pne 's/from3/to3/' -i temp
perl -pne 's/from4/to4/' -i temp
perl -pne 's/from5/to5/' temp > out

Как я могу просто поместить все это в один perl скрипт?

Ответы [ 2 ]

10 голосов
/ 21 июня 2010

-e принимает произвольную сложную программу. Так что просто присоединяйтесь к операциям замещения.

perl -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/' in > out

Если вам действительно нужна Perl-программа, которая явно обрабатывает ввод и циклы, отмените однострочную строку, чтобы увидеть сгенерированный код и работать отсюда.

> perl -MO=Deparse -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/'
LINE: while (defined($_ = <ARGV>)) {
    s/from1/to1/;
    s/from2/to2/;
    s/from3/to3/;
    s/from4/to4/;
    s/from5/to5/;
}
continue {
    print $_;
}
-e syntax OK
6 голосов
/ 21 июня 2010

Соответствующий ответ на вопрос, который вы не задали совсем : специальная переменная perl $^I, используемая вместе с @ARGV, дает возможность редактирования на месте:-i.Как и в опции -p, Deparse покажет сгенерированный код:

perl -MO=Deparse -pi.bak -le 's/foo/bar/'
BEGIN { $^I = ".bak"; }
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    s/foo/bar/;
}
continue {
    print $_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...