2017-09-24 1 views
2
cat -E test1.txt 

Ausgang:Perl-Datei verarbeitet - überschreibt vorhandene Daten statt Anhängen/Löschen

car$ 
$ 
$ 

Ich mag ändern „Auto“ nur mit „Fahrrad“ und neue/leere Zeilen entfernen.

Dies funktioniert wie erwartet:

#!/usr/bin/perl -w 
open(FILE1,"<","./test1.txt"); @araj=<FILE1>; close(FILE1); 
open(FILE2,">","./test1.txt"); 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 
print(FILE2 @araj); 
close(FILE2); 

und

cat -E test1.txt 

Ausgang ist 100% richtig für mich:

bike$ 

Aber in obigen Fall bin ich mit 2x Öffnen/Datei schließen. Also ich benutze 2x Dateigriffe.
Ich möchte nur verwenden 1x Datei-Handle
(es ist für Lernzwecke, nur versuchen zu verstehen, wie +> + >> >> funktionieren ...).
Zum Beispiel:

#!/usr/bin/perl -w 
open(FILE2,"+<","./test1.txt"); #what file handle should be here? +> , +>> >> .... ? 
@araj=<FILE2>; 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 
print(FILE2 @araj); 
close(FILE2); 

Ausgang ist falsch:

car$ 
$ 
$ 
bike$ 

Warum dies anhängt, aber kein Überschreiben? Wenn ich andere Dateizugriffsnummern verwendete, sind auch die Ergebnisse falsch, z. B. leere Datei ... Welche Dateikennung wird zum Lesen und Überschreiben verwendet?

+0

https://perldoc.perl.org/functions/seek.html –

+0

@ikegami dank Datei. Korrigiert. – collector1871

Antwort

2

Warum hängt dies an, aber kein Überschreiben?

Sie haben zuerst alle Daten bis zum Ende der Datei gelesen. Dies bedeutet, dass die Dateiposition für das nächste Lesen oder Schreiben nun nach all den Daten ist, die Sie gelesen haben, d.h. am Ende der Datei. Wenn Sie vom Anfang der Datei schreiben Daten wollen, müssen Sie die Datei Position seek unter Verwendung ändern:

seek($filehandle,0,0); # position at beginning of file 

Die nächsten Daten werden Sie schreiben dann geschrieben werden, beginnend mit dieser neuen Dateiposition, also von Anfang an der Datei. Sobald Sie fertig sind müssen Sie aus der Datei mithilfe truncate mit der aktuellen Dateiposition alle Daten nach der aktuellen Dateiposition entfernen Sie mit tell haben:

truncate($filehandle, tell($filehandle)); 

Oder das ganze Programm:

use strict; 
use warnings; 
open(my $fh, "+<", "./test1.txt"); 
my @araj = <$fh>; 
for(@araj) { 
    s{car}{bike}; 
    s{^\n}{}; 
} 
seek($fh, 0, 0);   # seek at the beginning of the file 
print $fh @araj; 
truncate($fh, tell($fh)); # remove everything after current file position 
close($fh); 
+0

danke, tolle antwort für mich – collector1871

1

Nachdem Sie die Datei im Array gelesen haben, ist die Position des Dateihandles das Ende der Datei. Dann sollten Sie die Dateihandle-Position durch seek Funktion ändern (am Anfang der Datei festgelegt) perldoc seek. Weiter Größe ändern Sie durch truncateperldoc truncate

#!/usr/bin/perl -w 
open(FILE2,"+<","./test1.txt"); #what file handle should be here? +> , +>> >> .... ? 
@araj=<FILE2>; 
map { 
[email protected]@[email protected]; [email protected]^\[email protected]@; 
} @araj; 

seek(FILE2, 0, 0); 
print(FILE2 @araj); 
truncate(FILE2, tell(FILE2)); 

close(FILE2); 
+0

danke, es funktioniert (das ist auch eine gute antwort) – collector1871

Verwandte Themen