Gibt es eine Möglichkeit mit den Standard-Perl-Bibliotheken eine Datei zu öffnen und zu bearbeiten, ohne sie zu schließen und dann wieder zu öffnen? Alles, was ich tun kann, ist entweder eine Datei in einen String zu lesen, die Datei zu schließen und dann die Datei mit einer neuen zu überschreiben. oder lesen und dann an das Ende einer Datei anhängen.
Folgendes funktioniert momentan aber; Ich muss es öffnen und zweimal schließen, anstatt einmal:
%Vor% Sie haben die Datei zum Lesen und Schreiben bereits geöffnet, indem Sie sie mit dem Modus <+
geöffnet haben, Sie machen nichts Nützliches damit - wenn Sie den Inhalt der Datei ersetzen wollten, anstatt auf den aktuellen zu schreiben Position (das Ende der Datei) dann sollten Sie seek
zurück an den Anfang, schreiben, was Sie brauchen, und dann truncate
, um sicherzustellen, dass nichts übrig bleibt, wenn Sie die Datei kürzer gemacht haben.
Aber nachdem Sie versucht haben, das Inplace-Filtern einer Datei durchzuführen, könnte ich vorschlagen, dass Sie die Inplace-Editing-Erweiterung von Perl verwenden, anstatt die gesamte Arbeit selbst zu erledigen?
%Vor% Und das ist alles Code, den Sie brauchen - Perl übernimmt den Rest. Das Festlegen der $ ^ I-Variable entspricht der Verwendung von - i Befehlszeilenflagge . Ich habe einige Änderungen an Ihrem Code auf dem Weg gemacht - use utf8
tut nichts für ein Programm ohne literales UTF-8 in der Quelle, binmode
ing stdin und stdout tut nichts für ein Programm, das nie stdin oder stdout verwendet, speichert Die CWD tut nichts für ein Programm, das niemals chdir
s. Es gab keinen Grund, jede Datei auf einmal zu lesen, also änderte ich sie in zeilenweise, und machte die Regexes weniger peinlich (und übrigens ist der Modifizierer /o
regex für fast genau nichts in diesen Tagen gut, außer das Hinzufügen von Hard-to finden Sie Fehler in Ihrem Code).