Ich schreibe die Datei mit Perl. Es gibt eine Situation, wo nach dem Schreiben von 4 Zeilen, ich 4 Zeilen zurückgehen und etwas schreiben muss, dann zurück zum Ende der Datei kommen und wieder zu schreiben beginnen. Gibt es eine Möglichkeit, die Dateizugriffslinie zeilenweise zu verschieben?Wie kann ich die Dateizeigerposition 4 Zeilen zurück ändern, während ich die Datei mit Perl schreibe?
Antwort
Sie können die Position tatsächlich mit seek
verschieben. Dateien haben jedoch keine Indizes von Zeilen, so dass Sie entweder die Position der Zeilen verfolgen müssen (wie erhalten Sie mit tell
), während Sie sie schreiben, oder entdecken Sie sie mit einem ähnlichen Ansatz wie File::ReadBackwards.
Was möchten Sie mit dem Inhalt der Datei tun, der zwischen der gesuchten Position und dem Ende der Datei liegt? Sie müssen es kopieren, wenn Sie Zeilen einfügen möchten, oder truncate
die Datei, wenn Sie sie löschen möchten.
Wenn Sie können, einen Puffer stattdessen beibehalten.
my @buf;
while (...) {
if (...) {
splice(@buf, -4, 0, $line); # Insert the line 4 lines from the end.
} else {
push(@buf, $line); # Append a line.
}
print($fh shift(@buf)) while @buf > 4;
}
print($fh @buf);
Sie können Tie::File verwenden Sie die ganze Magie zu tun. Es ties eine Datei in ein Array, so dass jede Zeile von einem Array-Element dargestellt wird. Tying ist ein Mechanismus, der sehr leistungsfähig ist, aber heutzutage als sehr fortgeschritten angesehen wird.
Das macht es möglich, normale Array-Operationen wie push
und unshift
oder sogar splice
für die Datei zu verwenden. Sie müssen keine Zeilenumbrüche einfügen. Es verwendet $/
automatisch.
use Tie::File;
tie my @file, 'Tie::File', 'foo.txt' or die $!;
push @file, "Line 1";
push @file, "Line 2";
push @file, "Line 3";
push @file, "Line 4";
push @file, "Line 5";
# to overwrite
$file[-4] = 'Line 6 overwrote line 2';
# to append
$file[-3] .= ' and Line 7';
# to insert
splice @file, -2, 0, 'Line 8';
Die Datei wird nun enthalten:
Line 1
Line 6 overwrote line 2
Line 3 and Line 7
Line 8
Line 4
Line 5
1) Ich sage fortgeschritten, aber wirklich meine ich, dass es nicht weit verbreitet ist, oder heutzutage verstanden. Es gibt nicht viele Lernmaterialien, die tie
abdecken, und der ursprüngliche Anwendungsfall des Zugriffs auf Datenbankdateien ist ziemlich veraltet und. Ich würde sagen, viele Leute haben noch nie davon gehört, obwohl es ein starkes Feature ist.
Ich bin mir nicht sicher, ich würde es als fortgeschritten bezeichnen, so viel wie (fast?) einzigartig für Perl. Das bedeutet, dass Sie Leute haben, die das Konzept nicht wirklich verstehen. – Sobrique
@Sobrique Ich wählte das Wort _advanced_, da es in modernen Lernressourcen kaum abgedeckt ist, und es gibt nicht viele häufige Anwendungsfälle. Ich stimme zu, dass es ziemlich einzigartig ist, obwohl ich mich erinnere, kürzlich eine Rede zu sehen, in der jemand sagte, dass eine neuere Sprache jetzt eine ähnliche Funktion hat und dass wir sie schon lange haben. Aber ich kann mich nicht erinnern, wo das war oder welche Sprachen. – simbabque
Nein, wahr genug. Da OO alltäglich ist - und im Allgemeinen ein besser verstandenes Paradigma - ist die Notwendigkeit von "tie" vermindert. Und es ist wohl ein bisschen gefährlich, ein "magisches" Ding zu haben, das wie eine normale Variable aussieht. – Sobrique
- 1. Wie kann ich eine Datei komprimieren, während ich darauf schreibe?
- 2. Wie schreibe ich Befehle mit mehreren Zeilen in Dockerfile, während die neuen Zeilen beibehalten werden?
- 3. Wie schreibe ich Perl-Objekt mit Plugins?
- 4. Kann ich die MD5sum eines Verzeichnisses mit Perl bekommen?
- 5. Wie schreibe ich ein Lucene.Net RAMDirectory zurück auf die Festplatte?
- 6. Wie kann ich die Zeilen einer Datei in ein Array in Perl einlesen?
- 7. Wie schreibe ich die Abfrage?
- 8. Wie bekomme ich ein Win32-Programm, um die Dateigröße zu aktualisieren, während ich noch Dateien schreibe?
- 9. Wie kann ich die Mittel von Zeilen berechnen, während die Nullwerte aus Zeilen im Datenrahmen
- 10. Wie kann ich eine passende Zeile und die nächsten drei Zeilen in Perl drucken?
- 11. Wie kann ich die MANIFEST.MF-Datei während der Testausführung lesen?
- 12. Wie schreibe ich js Datei mit PHP?
- 13. Kann ich in Perl die Länge einer Zeile begrenzen, während ich sie aus einer Datei lese (wie zB fgets)?
- 14. Wie kann ich die Startseite ändern?
- 15. Wie schreibe ich die Abfrage mit linq?
- 16. Wie kann ich empfangene Socket-Nachrichten in Perl ändern?
- 17. Wie schreibe ich die Daten in die neue Spalte in bestehenden CSV-Datei mit Python-Skript
- 18. Wie schreibe ich mehrere Zeilen in eine Datei von Benutzereingabe (Perl)
- 19. Wie schreibe ich die folgende Mongo-Abfrage?
- 20. Wie kann ich die Definition von "Linie" in Grep ändern?
- 21. Wie kann ich die Perl-Konsolenausgabe in einer GUI anzeigen?
- 22. Wie zähle ich die Anzahl der Zeilen in einer großen CSV-Datei mit Perl?
- 23. Wie kann ich die Arbeit während tkinter
- 24. Rails 4 - Wie schreibe ich einen Bereich
- 25. Wie Zeilen ändern, die
- 26. Woher bekomme ich Perl 4?
- 27. Wie kann ich die Standard-Apache httpd.conf Datei Speicherort ändern
- 28. Wie kann ich die Ausnahmemeldungen in Vs2012 ändern?
- 29. Wie schreibe ich Daten in Zeilen in einer CSV-Datei
- 30. Wie schreibe ich eine Funktionsreferenz in einem Perl-Modul?
Re: 'Gibt es eine Möglichkeit, Datei-Handle-Position Zeile weise zu verschieben?' Nein. Http://xyproduction.info/ –