/ / Wie man 'perl -pne' Funktionalität in ein Perl Skript - Perl steckt

Wie man 'Perl-Pne' Funktionalität in ein Perl-Skript - Perl steckt

Also kann ich in der Kommandozeile bequem so etwas tun:

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

Und wenn ich das wiederholen muss und / oder habe ich mehrere andere perl -pne Transformationen, ich kann sie in sagen, a .bat Datei in Windows. Das ist natürlich ein ziemlich umständlicher Weg. Ich sollte nur einen schreiben perl Skript, das all diese Regex-Transformationen enthält.

Also, wie schreibst du es? Wenn ich ein Shell-Skript habe, das diese Zeilen enthält:

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

Wie kann ich das alles in einen zusammenfassen? perl Skript?

Antworten:

10 für die Antwort № 1

-e akzeptiert beliebiges komplexes Programm. Schließen Sie sich einfach Ihren Substitutionsoperationen an.

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

Wenn Sie wirklich ein Perl-Programm wollen, das Input und Looping explizit behandelt, sollten Sie den Einzeiler deaktivieren, um den generierten Code zu sehen und von hier aus zu arbeiten.

> 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 für die Antwort № 2

Verwandte Antwort auf die Frage, die Sie nicht getan haben ganz frage: die Perl Sondervariable $^I, zusammen benutzt mit @ARGV, gibt das In-Place-Bearbeitungsverhalten von -i. Wie bei der Option -p zeigt Deparse den generierten Code an:

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