/ / Jak umieścić funkcję „perl -pne” w skrypcie perla - perl

Jak umieścić funkcjonalność "perl -pne" w skrypcie perla - perl

Więc w linii poleceń mogę wygodnie zrobić coś takiego:

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

A jeśli muszę to powtórzyć i / lub mam kilka innych perl -pne transformacje, mogę je umieścić, powiedzmy, a .bat plik w systemie Windows. To jest raczej okrężny sposób na zrobienie tego, oczywiście. Powinienem po prostu napisać jeden perl skrypt zawierający wszystkie te przekształcenia wyrażenia regularnego.

Więc jak to piszesz? Jeśli mam skrypt powłoki zawierający te linie:

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

Jak mogę po prostu umieścić je wszystkie w jednym perl scenariusz?

Odpowiedzi:

10 dla odpowiedzi № 1

-e akceptuje dowolny złożony program. Dołącz do operacji zastępczych.

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

Jeśli naprawdę chcesz, aby program Perla, który obsługuje dane wejściowe i pętle, wyraźnie, odrzuć jeden liner, aby zobaczyć wygenerowany kod i pracować z tego miejsca.

> 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 dla odpowiedzi nr 2

Powiązana odpowiedź na pytanie, którego nie zrobiłeś całkiem Zapytaj specjalna zmienna perl $^I, używane razem z @ARGV, daje możliwość edycji w miejscu -i. Podobnie jak opcja -p, Deparse pokaże wygenerowany kod:

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 $_;
}