Grundsätzlicher Aufbau
Dieses Beispiel ist ähnlich dem aus "Eine Zeile aus einer Datei löschen" was weiter oben behandelt wurde.
Hier soll es aber nicht um das löschen nur einer Zeile gehen, es sollen mehrere Zeilen einer Datei nache einem
festgelegten Kriterium in eine andere Datei verschoben werden.
Praktische Anwendung wäre das löschen von z.B. Userdaten nach einem festgelegten Zeitraum.
open (DATEN, "+>>$dateipfad/daten.dat") or scripterror("Fehler: Kann daten.dat nicht oeffnen!",$!);
flock (DATEN, 2);
seek DATEN, 0, 0;
my @daten = <DATEN>;
# Zwei neue Arrays definieren
my @neue_daten = ();
my @geloeschte = ();
foreach $daten (@daten) {
chomp $daten;
($eintragsid,$ablauf,$email,$url,$name) = split /\|/, $daten;
# Vergleichen der Datumswerte die in der Datei stehen
if ($aktuelles_datum < $ablauf) {
$daten = "$daten\n";
# Inhalte entsprechend der Vorgae in die Arrays pushen
push @neue_daten, $daten;
} else {
$olddaten = "$daten\n";
push @geloeschte, $olddaten;
}
}
seek DATEN, 0, 0;
truncate DATEN, 0;
print DATEN @neue_daten;
flock (DATEN, LOCK_UN);
close DATEN;
# Hier wird der Inhalt des Arrays @geloeschte in eine neue Datei geschrieben.
open (ALTEDATEN, ">>$dateipfad/daten.temp") or scripterror("Fehler: Kann daten.temp nicht oeffnen!",$!);
flock (ALTEDATEN, 2);
print ALTEDATEN @geloeschte;
close ALTEDATEN;
chmod(0777, "$dateipfad/daten.temp");
Wie funktioniert's?
Hier wird wie im Beispiel "Eine Zeile aus einer Datei löschen" vorgegangen, der Unterschied besteht hier darain das zwei leere Arrays
angelegt werden die Daten aufnehmen sollen.
Bei $aktuelles_datum < $ablauf wird nun der Datum verglichen, das was kleiner als der Ablaufdatum ist wird behalten und in das Array
@neue_daten gepusht, was darüber liegt in das Array @geloeschte.
Ideal zum vergleichen von Datumswerten ist die hier vorgestellte Datumsroutine
Diese kann den Datum in "Normalform" - also z.B. 22.9.2003 liefern und auch als Tageszahl z.B. 2452606. Mit diesen Zahlenwerten lässt es sich hervorragend rechnen.
Will man z.B. Eintröäge nach 30 Tagen verfallen lassen, oder wie hier in eine Archivdatei schreiben, braucht man nur zu der aktuellen Tageszahl 30 addieren.
|