Perl-Flags -pe, -pi, -p, -w, -d, -i, -t?

106

Ich habe viele Möglichkeiten gesehen, Perl-Code oder -Skripte mit unterschiedlichen Flags auszuführen. Wenn ich jedoch versuche zu googeln, was jede Flagge bedeutet, erhalte ich hauptsächlich Ergebnisse für generische Perl-Websites, und dort werden keine spezifischen Informationen zu den Flaggen oder ihrer Verwendung gefunden.

Unten sind die Flaggen aufgeführt, denen ich am häufigsten begegne, und ich habe keine Ahnung, was sie bedeuten:

  • perl -pe
  • Perl- pi
  • perl -p
  • perl -w
  • perl -d
  • perl -i
  • perl -t

Ich wäre Ihnen sehr dankbar, wenn Sie mir sagen würden, was diese jeweils bedeuten, und einige Anwendungsfälle für sie, oder mir zumindest einen Weg nennen, ihre Bedeutung herauszufinden.

Tudor Constantin
quelle
21
Wenn Sie nach grundlegenden Antworten zu Perl suchen, gelangen Sie häufig zu einigen wirklich nicht hilfreichen Websites. Überprüfen Sie immer zuerst die eigene Dokumentation von Perl.
ysth
2
Abgeordnet. In diesem Fall enthält perldoc perlrunPerl eine Liste aller Befehlszeilenoptionen.
Sherm Pendley
1
Google-Problem: Das Minuszeichen wird von Google als "diesen Begriff ausschließen" interpretiert. Um dieses Verhalten zu vermeiden, setzen Sie den Begriff mit dem Minuszeichen in Anführungszeichen.
Roger Krueger

Antworten:

146

Ja, Google ist notorisch schwierig für die Suche nach Interpunktion und leider Perl nicht scheint meist gemacht zu sein Interpunktion up :-)

Die Befehlszeilenoptionen sind alle in Perlrun aufgeführt . (über die Befehlszeile telefonisch verfügbar perldoc perlrun)

Gehen Sie kurz nacheinander auf die Optionen ein:

-p: Platziert eine Druckschleife um Ihren Befehl, sodass er auf jeden Befehl einwirkt
    Zeile der Standardeingabe. Wird meistens verwendet, damit Perl das schlagen kann
    Hosen aus awk in Bezug auf Leistung und Einfachheit :-)
-n: Platziert eine nicht druckbare Schleife um Ihren Befehl.
-e: Ermöglicht es Ihnen, das Programm eher als Argument anzugeben
    als in einer Datei. Sie möchten kein Skript erstellen müssen
    Datei für jeden kleinen Perl-Einzeiler.
-i: Ändert Ihre Eingabedatei an Ort und Stelle (erstellt eine Sicherungskopie der
    Original). Praktisch, um Dateien ohne die {Kopie zu ändern,
    Original löschen, umbenennen}.
-w: Aktiviert einige Warnungen. Jeder gute Perl-Codierer wird dies verwenden.
-d: Läuft unter dem Perl-Debugger. Zum Debuggen Ihres Perl-Codes
    offensichtlich.
-t: Behandelt bestimmten "verdorbenen" (zweifelhaften) Code als Warnungen (richtig)
    Der Taint-Modus tritt bei diesem zweifelhaften Code auf. Wird für Rindfleisch verwendet
    Erhöhen Sie die Perl-Sicherheit, insbesondere wenn Sie Code für andere ausführen
    Benutzer, wie z. B. Setuid-Skripte oder Web-Inhalte.
paxdiablo
quelle
1
Ich habe nicht bemerkt, dass Sie sich darauf bezogen haben perldoc perlrun. Ich habe meine Antwort gelöscht. :-)
Alan Haggai Alavi
4
-wist eigentlich generell zu vermeiden, da es Warnungen für den gesamten Code ermöglicht, einschließlich CPAN-Modulen, die nicht unter Berücksichtigung von Warnungen geschrieben wurden. Die Ergebnisse sind im Allgemeinen ziemlich laut und ziemlich nutzlos.
Abenddämmerung -inaktiv-
9
-wwird im Allgemeinen vermieden, sollte aber use warningsin Ihrem eigenen Code durch ersetzt werden.
Plusplus
6
@duskwuff: Im Allgemeinen stimme ich zu, und ich tue es use warningsin meinem eigenen Code, aber -w hat eine Verwendung - es hilft, schlecht geschriebene CPAN-Module auszusortieren. :-)
Sherm Pendley
2
@IanBytchek Argumente, die einen zusätzlichen Parameter annehmen dürfen / müssen, dürfen nicht in einer komprimierten Liste enthalten sein. -inimmt eine Erweiterung für die Sicherung. -eNimmt einen Perl-Befehl. In -0ep sagen Sie Perl, dass 'p' ein Perl-Befehl anstelle eines Arguments ist. Das wird überhaupt nicht gut funktionieren.
tjd
10

Das -pFlag führt das Skript grundsätzlich mit aus

while (<>) {
# exec here
}
continue {
    print or die "-p destination: $!\n";
}

-e ermöglicht es Ihnen, ein Skript an zu übergeben STDIN

perl -e '$x = "Hello world!\n"; print $x;'

-iWeist den Interpreter an, dass alle STDINvom ausführenden Skript übergebenen Daten an Ort und Stelle ausgeführt werden sollen.

-wist dasselbe wie use warnings;, jedoch in einem globalen und nicht in einem lokalen Bereich

-d führt den Perl-Debugger aus

zellio
quelle
2
-wist nicht ganz das gleiche wie use warnings, letzteres ist auf die lokale Datei beschränkt
plusplus
plusplus, wahr, patchende Antwort.
Zellio
2
Das Übergeben des Skripts als Argument ist nicht dasselbe wie das Übergeben an STDIN. -i nimmt Dateinamen aus der Argumentliste, nicht stdin. Während STDIN häufig mit dem steuernden Terminal verknüpft ist und von der Shell geerbt wird, die stdin liest und die Argumentliste für Perl erstellt, sind sie NICHT dasselbe.
William Pursell
8

Andere haben Perlrun erwähnt. Wenn Sie B :: Deparse verwenden, können Sie sehen, was es bedeutet (für die meisten Dinge):

$ perl -MO=Deparse   -p  -e 1
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

1 wird durch '???' dargestellt, da es wegoptimiert ist.

$ perl -MO=Deparse   -p -i  -e 1
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

-i setzt $ ^ I, wie

$ perl -MO=Deparse   -p -i.bak  -e 1
BEGIN { $^I = ".bak"; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

Denken Sie jedoch daran, dass <ARGV> 2 offene Argumente verwendet. Verwenden Sie daher keine Dateinamen, die mit beginnen > <oder mit beginnen / enden |.

liame
quelle
4

Es gibt auch eine wichtige Flagge, -ndie in der Liste nicht erwähnt wird.

-nfunktioniert genauso wie -p, nur $_wird standardmäßig nicht gedruckt . Dies kann beim Filtern von Textdateien sehr nützlich sein.

Auf diese Weise kann Perl grep | sedin einem einzigen Einzeiler ersetzt werden.

Beispielsweise:

perl -ne 'print "$1\n" if /Messages read: (\d+)/' <my_input.txt

Gibt jeden ganzzahligen Wert aus, der nach "Nachrichten lesen:" gefunden wurde, und nichts weiter.

Rustyx
quelle
Dies kann weiter vereinfacht werden. Der "Druck" $ 1 \ n "" ist nicht erforderlich. Sie können stattdessen einfach "Drucken" verwenden.
verschlungenes Elysium
Nein, es kann nicht, print $1ist nicht dasselbe wie print( print $_).
Rustyx
Es kann: echo abc | perl -nw -e "print if (1)"wird gedruckt abc. Keine Notwendigkeit für die $1Referenz.
verschlungenes Elysium
@devouredelysium: Ja, möchte aber nicht die gesamte Zeile drucken, sondern nur die Nummer, die mit dem regulären Ausdruck übereinstimmt.
Ingo Blechschmidt