Thread implementing 'perl -i': Using a fh rw (13 answers)
Opened by dukeofnukem at 2007-03-12 19:06

betterworld
 2007-03-13 15:58
#74987 #74987
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Warum willst Du denn nur einen fh verwenden?  Und warum scheiden externe Module aus?  (Und wie renee schon sagt: Tie::File ist nicht mehr extern..)

Wenn die Daten nicht so groß sind, dass sie ohne Probleme zwei Mal auf die Festplatte passen, wäre so etwas auch gut:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
# Einlesen
open my $in, '<', $filename or die $!;
my $daten = do {local $/; <$in>};
close $in;

# Verarbeiten
tu_was_mit($daten);

# Ausgeben
open my $out, '>', $filename . '.tmp' or die $!;
print $out $daten or die $!;
close $out or die $!;
rename($filename . '.tmp', $filename) or die $!;


Ansonsten gibt es eben auch noch die Variante:
Code: (dl )
1
2
3
4
5
6
7
open my $f, '+<', $filename or die $!;
my daten = do {local $/; <$f>};
tu_was_mit($daten);
seek($f, 0, 0) or die $!;
truncate($f, 0) or die $!;
print $f $daten or die $!;
close $f or die $!;


Aber ich kann es nicht oft genug betonen: Hände weg von der zweiten Variante:  Denn wenn dein Programm an der richtigen Stelle abstuerzt (oder der ganze Rechner), ist die Datei leer und die Daten futsch.

Dieses Problem hat die erste Variante nicht.  Ausserdem ist die Änderung an der Datei in der ersten Variante atomar, d. h. immer wenn jemand die Datei ausliest, ist sie vollstaendig und enthaelt nicht irgendwelches teilweise geschriebene Zeug.  (Wenn Dein Programm mehrfach gleichzeitig laufen koennte, brauchst Du aber wahrscheinlich trotzdem ein flock.)

Quote
Bin leider relativer n00b was Perl angeht

Dann solltest Du wohl doch nicht zu viel mit $^I rumspielen ;) Sorry, dass ich Dir davon erzaehlt habe.

View full thread implementing 'perl -i': Using a fh rw