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?

War es hilfreich?

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;

verbrauchen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top