Warum muss in Perl immer die Option „-p“ angegeben werden, auch wenn die Eingabedatei stdin ist?

Warum muss in Perl immer die Option „-p“ angegeben werden, auch wenn die Eingabedatei stdin ist?

Aktualisierung Nr. 2: Ich hatte ein großes Missverständnis bezüglich der -pOption, jetzt ist mir klar, dass sie verwendet wird, um alle als Argument angegebenen Dateien zu verarbeiten, aber ich verstehe immer noch nicht ganz, warum dies beim Lesen der Eingabe von erforderlich ist stdin.


Aktualisierung Nr. 1: Mir ist aufgefallen, dass die -pOption immer erforderlich ist (zumindest beim Durchführen einer Ersetzung), selbst wenn das Standardtrennzeichen (Neuzeilenzeichen) verwendet wird und die Eingabedatei nur eine Zeile umfasst. Ich verstehe nicht ganz, warum das Weglassen der -pOption zum Verarbeiten einer einzelnen Zeile (was angemessen erscheint) alles kaputt macht (d. h. keine Ausgabe erfolgt).

Beispielsweise wird beim Ausführen die erwartete echo -n 'test' | perl -pe 's/test/newstring/'Ausgabe ausgegeben, es wird jedoch nichts ausgegeben.newstringecho -n 'test' | perl -e 's/test/newstring/'


Ursprüngliche Frage:

Warum muss beim „Slurping“ der gesamten Datei, aus stdinder in einem Perl-Befehl gelesen wird (z. B. perl -0777 -e [...]), immer noch die -pOption angegeben werden, um die Datei tatsächlich verarbeiten zu können (z. B. perl -0777 -pe [...])?

Ich verstehe, dass die -pOption eine Schleife um jede Zeile des Befehls legt, aber warum reicht es nicht aus, das Trennzeichen zu ändern (in diesem Fall zu entfernen), damit Perl die Datei verarbeiten kann? Oder warum ist es trotz der Tatsache, dass die Datei nur einmal verarbeitet wird, notwendig, Perl anzuweisen, eine Schleife um jede Zeile des Befehls zu legen?

Antwort1

Der perl --helpBefehl besagt, dass -p assumes a loop like -n but prints line also, like sed. sedein Stream-Editor ist und zum Bearbeiten von Text verwendet wird, ähnlich wie die -pOption mit perl. funktioniert. -pDies ist die einzige Option zum perlDrucken der verarbeiteten Ausgabe. Ohne die -pOption kann die verarbeitete Ausgabe nicht gedruckt werden. Wie in meinem Beispiel unten gezeigt, wird die Zeichenfolge nicht ersetzt, wenn der Ausdruck nicht erfolgt.

WARNUNG: ERSETZEN SIE DAS -pNICHT DURCH -n, DA IHRE DATEI DADURCH GELÖSCHT WIRD!

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="nosplash"

~$ sudo perl -pi -e 's/nosplash/splash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

~$ sudo perl -i -e 's/splash/nosplash/' /etc/default/grub

~$ sudo grep "CMDLINE_LINUX_DEFAULT" /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="splash"

verwandte Informationen