Wie füge ich Linien oben und unten eine Datei in Perl?
Möchte ich hinzufügen, dass eine Linie zum oberen und unteren Rand der Datei. Ich kann es auf folgende Weise.
open (DATA, "</usr/old") || die "cant open old\n"; #file to which line has to be added
my @body=<DATA>;
close(DATA);
open (FILE, ">/usr/new") || die "cant open new\n"; #file after stuff has been added
print FILE "9 431";
print FILE "\n";
my $body=@body;
for (my $i=0; $i<$body;$i++){
print FILE "$body[$i]";#not using for loop leads to addition of spaces in new file
}
print FILE "(3,((((1,4),(7,6)),(2,8)),5),9)";
Seit ich laufen für eine große Menge von Datei, wird dieser Vorgang sehr zeitaufwendig sein. Macht Perl eine spezifische Funktionalität, die verwendet wird zum hinzufügen von Zeilen am oberen und unteren Ende einer Datei?
Es gibt keine solche Sache wie das hinzufügen von Linien auf der Oberseite, müssen Sie irgendeine Art von Puffer zu speichern, was Sie schreiben wollen, auf der Unterseite, es kann ein string sein, aber ich bevorzuge eine temp-Datei. So dass man schreiben/Anhängen von oben nach unten. Es gibt keinen anderen Weg.
nicht wahr. Sie können fügen Sie eine Zeile am Anfang der Datei mit einem einfachen test:
dein Beispiel erzeugt eine neue Datei, schreibt die neue hinein, dann schreibt den Inhalt der original-Datei. Die Tatsache, dass das newfile endet ein link mit dem gleichen Namen wie das original ändert nichts an der Tatsache, dass es eine andere Datei.
Ah, ich sehe. Guter Punkt. @WilliamPursell
nicht wahr. Sie können fügen Sie eine Zeile am Anfang der Datei mit einem einfachen test:
perl -pi -e 'print "This will appear before the original first line\n" if $. == 1' inFile.txt
Von stackoverflow.com/a/4388309/48082dein Beispiel erzeugt eine neue Datei, schreibt die neue hinein, dann schreibt den Inhalt der original-Datei. Die Tatsache, dass das newfile endet ein link mit dem gleichen Namen wie das original ändert nichts an der Tatsache, dass es eine andere Datei.
Ah, ich sehe. Guter Punkt. @WilliamPursell
InformationsquelleAutor shubster | 2009-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom perlfaq5's Antwort auf Wie kann ich das ändern, löschen oder einfügen einer Zeile in eine Datei oder Anhängen an den Anfang einer Datei?
Wie kann ich das ändern, löschen oder einfügen einer Zeile in eine Datei oder Anhängen an den Anfang einer 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
Perl kann nicht einfügen an den Anfang einer Datei, da einige Betriebssysteme ermöglichen. Sie brauchen eine rewrite-operation der Art, die Sie hier haben.
Eines der möglichen Probleme, die Sie mit diesem code ist mit wirklich großen Dateien, die nicht passen in Ihrem Adressraum.
Durch Lesen der gesamten Datei, dann schreiben Sie es aus, Sie können ausführen in den Speicher Probleme. Was ich gemacht hätte, wäre:
Diese werden schnell und Speicher-effizient.
Natürlich, wenn Sie Ihre Dateien sind klein genug, um passen in den Speicher, stick mit, was Sie haben. Es ist gut genug.
Update:
Genug Leute scheinen unter dem Missverständnis, dass ich für ein shell-script ist, dachte ich, ich es gerade. Sie können all die Dinge, die oben von in native Perl.
Aber möchten Sie vielleicht zu prüfen, ob es notwendig ist, zu verwenden Perl. Ein shell-Kommando wie:
tut den trick genauso gut (und wahrscheinlich genauso schnell).
Natürlich, wenn Sie müssen Perl, dann ignorieren Sie dieses update, wie das Geschwafel eines alten Mannes 🙂
Sie sollte einen Blick auf den source-code unter Tie::File, um zu sehen, was es tut 🙂 Dann lassen Sie mich wissen, wie ' s besser aus performance-POV.
manchmal ist es ok, um die Handels-performance für Programmierer zur Verfügung. In der Tat, nehmen Sie einen Blick auf die gesamte Geschichte der so genannten computer science.
InformationsquelleAutor paxdiablo
Verwenden Tie::File, die Zugriff auf die Zeilen einer Datei über ein Perl-array. Es kommt mit standard-distribution.
Beispiel aus der Dokumentation:
InformationsquelleAutor zakovyrya
Drei Antworten gegeben worden, die zu verewigen die sehr schlechte Praxis:
Nicht nur das, der code ist fehlerhaft, da Sie nicht das öffnen der Datei zum schreiben, sondern zum Lesen.
Wenn Sie einen öffnen fehlschlägt, können Sie dem Benutzer mitteilen warum es fehlgeschlagen ist. Bitte gewöhnen Sie sich an, einschließlich des"$"! in der Fehlermeldung. Auch, verwenden Sie die drei-argument-form
open
zu trennen, die mode aus dem Namen:(Dies gilt nicht Ihre Frage beantworten, aber ich versuche es eine Antwort eher als ein Kommentar für die Hervorhebung, und so dass ich überprüfen kann, wie es ist eine ziemlich lange speien her.)
InformationsquelleAutor
Es gibt viele Möglichkeiten, Sie können es tun, zum Beispiel mit einem einfachen shell-Skript die Art und Weise @Pax erwähnt. Sie können auch ersetzen Sie Ihre array und eine Schleife mit einem join():
InformationsquelleAutor sunny256
Meine änderung ghostdog74 ist, dass die Datei behandeln soll, die in die print-Anweisungen und die Datei geschlossen wird, nachdem die zweite print-Anweisung.
InformationsquelleAutor user121455
können Sie dies tun,
auf der Kommandozeile
InformationsquelleAutor ghostdog74
Ich nicht wirklich sprechen, Perl, aber vielleicht funktioniert für einige Situationen:
Ist, öffnen Sie die Datei im Absatz-Modus (eine Zeile), und ersetzen der Zeile mit dem neuen text, dabei eine in-place-rewrite.
Wahrscheinlich nicht effizient für viele große Dateien.
InformationsquelleAutor Steve Bennett
Als Pax sagt, es gibt keine integrierte Möglichkeit, dies zu tun. Aber wenn Sie wollen, es zu tun mit einer einzigen Zeile perl-Befehl aus der shell, die Sie verwenden können:
InformationsquelleAutor Nikhil