Ich verstehe, dass ich die aktuelle Zeilennummer einer Datei, die ich durchlaufe, mit der eingebauten Variable $.
bekommen kann. Als ein Experiment habe ich das verwendet, um jeder Zeile in einer Datei den Wert von $.
(die aktuelle Zeilennummer) voran zu stellen. Dies hat jedoch nicht wie erwartet funktioniert. I.e. gegeben den folgenden Dateiinhalt
Dann würde ich erwarten, dass der folgende Code jeder Zeile ihre Zeilennummer voranstellt
%Vor%, aber stattdessen gibt es die folgende Ausgabe
%Vor%Voranstellen jeder Zeile mit der Anzahl der Zeilen in der Datei. Anstelle der aktuellen Zeile.
Das liegt daran, dass die Art, wie Sie die Schleife geschrieben haben, die gesamte Datei liest, bevor Sie die Zeilen durchlaufen. Wenn Sie keinen besonderen Grund haben, etwas Besseres als einfachen sequenziellen Zugriff auf die Datei zu benötigen, sollten Sie while
anstelle von for
verwenden, wie folgt:
Wenn <
Dateihandle >
im Listenkontext aufgerufen wird (wie in Ihrer for
-Schleife), gibt es den gesamten Inhalt der Datei als Liste von Zeilen zurück. Daher verhält sich Ihr Code ähnlich wie wenn Sie dies stattdessen geschrieben hätten:
Um Ihr gewünschtes Ergebnis zu erreichen, sollten Sie <>
wiederholt im skalaren Kontext aufrufen (was die Zuweisung in der while
Bedingung tut), um jeweils eine Zeile aus der Datei zu holen und den Körper der Schleife mit auszuführen $.
auf die richtige Anzahl gesetzt.
Globale Dateihandles gelten auch als schlechte Methode. Aus mehreren Gründen ist es besser, stattdessen ein Dateihandle zu verwenden, auf das eine lexikalische Variable verweist:
%Vor%Tags und Links perl line-numbers text-files