Wie kann ich Befehlszeilenargumente und Dateinamen für <> in Perl mischen?
Frage
Sie sich das folgende dumme Perl-Programm:
$firstarg = $ARGV[0];
print $firstarg;
$input = <>;
print $input;
Ich betreibe es von einem Terminal wie:
perl myprog.pl sample_argument
Und diesen Fehler:
Can't open sample_argument: No such file or directory at myprog.pl line 5.
Alle Ideen, warum das so ist? Wenn es wird auf den <> versucht, es von der (nicht vorhandenen) Datei „sample_argument“ oder etwas zu lesen? Und warum?
Lösung
<>
ist eine Abkürzung für „aus den Dateien in @ARGV
angegebenen lesen, oder wenn @ARGV
leer ist, dann von STDIN
lesen“. In Ihrem Programm @ARGV
enthält den Wert ("sample_argument")
, und so Perl versucht, aus dieser Datei zu lesen, wenn Sie den <>
Operator verwenden.
Sie können es durch Clearing @ARGV
beheben, bevor Sie in die <>
Linie erhalten:
$firstarg = shift @ARGV;
print $firstarg;
$input = <>; # now @ARGV is empty, so read from STDIN
print $input;
Andere Tipps
Sehen Sie die PerlIO Mann-Seite, die zum Teil lautet:
Die Null-Dateihandle <> ist etwas Besonderes: es verwendet werden kann, um das Verhalten von sed zu emulieren und awk. Eingabe von <> kommt entweder von der Standardeingabe oder aus jeder Datei aufgelistet in der Befehlszeile. Hier ist, wie es funktioniert: das erste Mal, <> ausgewertet wird, die @ARGV Array wird überprüft, und wenn es leer ist, $ ARGV [0] auf „-“, die, wenn sie geöffnet gibt Ihnen Standardeingabe. Die @ARGV Array wird dann als eine Liste von verarbeiteten Dateinamen.
Wenn Sie STDIN, verwenden STDIN, nicht <>
.
In der Standardeinstellung Perl benötigt die Befehlszeilenargumente als Input-Dateien für <>
. Nachdem Sie sie verwendet haben, sollten Sie sie selbst mit shift;