Hallo auch,
Ich habe da eine Frage, welche das lesen und schreiben in
Dateien betrifft:
$ant_art_nr = 5;
if(open(BETLIST, "+)
{my @gesplittert = split(/#/,$_);
my $akt_bet_nr = $gesplittert[8];
if($akt_bet_nr == $ant_art_nr)
{print BETLIST ‚Ueberschrieben‘;
last();
}
}
close(BETLIST);
}
… In diesem Programmausschnitt müsste doch eigendlich,
sofern
$akt_bet_nr
gleich 5 ist die aktuelle Zeile
der Datei überschrieben werden, oder wo liege ich falsch?
So einfach geht es leider nicht, denn eine eingelesene
Datei wird als Bytestream angesehen, bei der jedes Byte
eine eigene laufende Nummer hat. Nun bringst Du dieses
Nummerierungsschema aber durcheinander, sobald Du den
alten String mit einem neuen anderer Länge überschreibst.
Deshalb funktioniert der obige Code nicht. Um eine Datei
zu ändern, ohne eine temporäre Datei anzulegen, gibt
es in Perl 2 Möglichkeiten:
a) mit dem inplace-Schalter -i, der im Hintergrund
für dich die ganze Arbeit in b) übernimmt:
perl -ipe 'filterbefehle' datei.txt
b) mit seek, tell und truncate:
open(FH, "+;
# @ARRAY ändern
# und jetzt in folgender Form zurückschreiben:
# an den Anfang der Datei zurück (Bytenr. 0)
seek(FH,0,0) or die;
# neuen Inhalt ab dieser Position einfügen
print FH @ARRAY or die;
# alles hinter der momentanen Position abschneiden
truncate(FH,tell(FH)) or die;
# und schliessen
close(FH) or die;
Damit gehts …
Gruss,
-Andreas.