Wie kann ich Zeilen überspringen, wenn Sie schlürfen eine Datei in Perl?
Wie kann ich dies tun?
open FILE, $somefile;
foreach (<FILE>)
{
if (/some_regex/)
{
$want_the_next_line = <FILE>;
$want_the_next_line_after_that = <FILE>;
}
}
Wissen, was ich meine? Ich wollen im Grunde zu schlürfen in einer Reihe von Linien in der Mitte meiner foreach-Schleife, anstatt zu erinnern, dass mein Zustand, und überprüfen Sie es jedes mal, wenn ich Durchlaufen. Und ich kann momentan nichts finden, was hilfreich auf <> in Perldoc.
Oh, und übrigens, ich möchte wirklich nicht:
@file = <FILE>;
Ich bin sicher, Sie verstehen.
Ich verstehe es nicht. Es sei denn vielleicht, du meintest zwar, nicht foreach, die Sie Lesen, in der gesamten Datei sowieso, wenn es ein memory besorgt.
Ja, ich konnte bedeutet foreach, und wie Sie erwähnen && David sagt, Sie unten, Las ich in der gesamten Datei als array sowieso, das ist genau das was ich wollte nicht.
Ja, ich konnte bedeutet foreach, und wie Sie erwähnen && David sagt, Sie unten, Las ich in der gesamten Datei als array sowieso, das ist genau das was ich wollte nicht.
InformationsquelleAutor Joe | 2009-04-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
while
stattforeach
:Den
while
Schleife liest nur eine einzige Zeile aus<FILE>
und Sie können dann tun, was Sie wollen mit ihm in der aktuellen iteration.Auch diese Technik wird Ihnen helfen zu vermeiden, Lesen die gesamte Datei auf einmal.
Technischer hintergrund:
foreach()
erfordert ein array, daher das Lesen in die ganze Datei auf einmal, während der Ausdruck in derwhile()
Schleife skalaren Kontext und wird nur aktiviert, für "falsche" Werte, wie die EOF erzeugt.Es ist 9:35 Uhr hier in Europa. Willkommen in der Globalisierung.
+1. Eine Warnung: im Gegensatz zu foreach, während clobbers $_, so dass Sie wahrscheinlich wollen, um "local $_;" vorher.
Eigentlich foreach will eine Liste, und während wertet seine Bedingung für die falschen Werte. "negative" Werte wie -1, sind tatsächlich wahr.
Mit allen Mitteln, nicht die Mühe, in einem 30-line-Skript. In größeren proejcts, den Kopf immer dafür, dass Sie Ihre Funktionen nicht clobber $_ (oder jedes andere global-Zustand) ist, dass Sie nicht haben, um darüber nachzudenken, ob es sicher ist, rufen Sie von überall aus-sogar eine innerste Schleife. Im Grunde ist es entfernt einen Typ von Informationen, die Sie benötigen, zu erinnern, was Ihre Funktionen sind.
InformationsquelleAutor David Schmitt
Können Sie die gleichen Techniken verwenden, die in perlfaq5: Wie kann ich das ändern, löschen oder einfügen einer Zeile in eine Datei oder Anhängen an den Anfang der Datei?:
(beigetragen von brian d foy)
Die grundlegende Idee, einfügen, ändern oder löschen einer Zeile aus einer text-Datei beinhaltet das Lesen und drucken der Datei zu der Stelle, die Sie wollen, um die änderung, der änderung, dann Lesen und ausdrucken der rest der Datei. Perl nicht zufällig Zugang zu den Linien (vor allem, da der Datensatz input-separator, $/, ist stummschaltbar), obwohl die Module wie Tie::File können fake it.
Einem Perl-Programm zu tun, diese Aufgaben nimmt die Grundform des öffnens einer Datei -, Druck-Linien, dann die Datei schließen:
Innerhalb dieses basic-form, fügen Sie die Teile, die Sie benötigen einfügen, ändern oder löschen von Zeilen.
Voranstellen Zeilen an den Anfang, drucken Sie die Zeilen, bevor Sie die Schleife druckt den bestehenden Linien.
Ändern bestehender Linien, fügen Sie den code zum ändern der Zeilen innerhalb der while-Schleife. In diesem Fall, den code findet alle kleingeschrieben Versionen von "perl" und uppercases. Das geschieht für jede Zeile, so werden Sie sicher, dass Sie tun sollen, dass auf jeder Linie!
Ändern, nur eine bestimmte Zeile der Eingabe Zeilennummer, $., ist nützlich. Erst Lesen und drucken die Zeilen bis zu der, die Sie ändern möchten. Als Nächstes Las die einzige Zeile, die Sie ändern möchten, ändern Sie es und drucken Sie es. Danach Lesen Sie den rest der Zeilen und drucken diese:
Überspringen Linien, verwenden Sie die Schleife steuert. Die next in diesem Beispiel überspringt Kommentarzeilen, und der Letzte Stoppt die Verarbeitung, sobald es auf entweder ENDE oder DATEN.
Tun die gleiche Art von Sache, die Sie zum löschen einer bestimmten Zeile, indem Sie mit weiter überspringen die Zeilen, die Sie nicht wollen, zu zeigen, bis in den Ausgang. In diesem Beispiel springt jede fünfte Zeile:
Wenn, aus irgendeinem seltsamen Grund, Sie wirklich wollen, um zu sehen, die gesamte Datei auf einmal eher als die Verarbeitung jeder Zeile können Sie schlürfen (so lange wie Sie können passen die ganze Sache in Erinnerung!):
Module wie File::Slurp und Tie::File können helfen mit, dass zu. Wenn Sie können, vermeiden Sie es jedoch, liest die gesamte Datei auf einmal. Perl will nicht, dass der Speicher wieder an das Betriebssystem, bis der Prozess abgeschlossen ist.
Können Sie auch Perl one-liners, eine Datei zu ändern. Die folgenden änderungen werden alle 'Fred' , 'Barney' in inFile.txt, überschreiben Sie die Datei mit dem neuen Inhalt. Mit der -p-Schalter, Perl schließt eine while-Schleife um den code, den Sie angeben, mit -e und-i stellt auf der in-place-Bearbeitung. Die aktuelle Zeile wird in $. Mit -p -, Perl-druckt automatisch den Wert von $ am Ende der Schleife. Man Vergleiche perlrun für mehr details.
Ein backup zu machen inFile.txt geben -i-eine Datei mit der Endung hinzufügen:
Nur die fünfte Zeile, können Sie eine test-Prüfung $., die Eingabe Zeilennummer, dann nur die operation durchzuführen, wenn der test erfolgreich verläuft:
Hinzufügen von Zeilen vor einer bestimmten Zeile können Sie fügen Sie eine Zeile (oder Zeilen!) vor Perl gibt $_:
Können Sie sogar fügen Sie eine Zeile am Anfang der Datei, da die aktuelle Zeile druckt am Ende der Schleife:
Einfügen einer Zeile nach einer bereits in der Datei, verwenden Sie den-n-Schalter. Es ist genauso wie-p außer, dass es nicht print $_ am Ende der Schleife, so müssen Sie selbst erledigen. In diesem Fall print $_ erste, und drucken Sie dann die Zeile, die Sie hinzufügen möchten.
Löschen von Zeilen, die nur drucken, die Sie möchten.
InformationsquelleAutor brian d foy