Zeilen löschen
Christian Bliß
- perl
Hallo,
wie kann ich bestimmte Zeilen aus einer txt-Datei löschen?
So weit bin ich schon:
open(LISTE, "<$root/liste.txt") or die "$!";
my @lines = <LISTE>;
while (<LISTE>) {
push @lines, $_;
}
foreach (@lines) {
($liste_name, $liste_email) = split(/##/, $_);
open(ANZEIGELISTE, ">>$root/liste_anzeige.txt") or die "$!";
print ANZEIGELISTE "$liste_name##$liste_email\n";
close(ANZEIGELISTE);
}
close(LISTE);
Nun will, sobald die 2 Variablen in die neue Datei liste_anzeige.txt geschrieben wurden, in der liste.txt diese Zeile löschen. Wie mach ich das? Muss ich das '<' vor $root in '>' oder '>>' ändern?
MfG Christian Bliß
Halihallo Christian
open(LISTE, "<$root/liste.txt") or die "$!";
my @lines = <LISTE>;
while (<LISTE>) {
hä? - Du liest alle Zeilen der Datei ein und willst sie dann nochmals einlesen?
Einmal reicht, zudem wäre ein zeilenweises einlesen besser:
while (<LISTE>) {
my ($liste_name,$liste_email) = split(...);
}
so brauchst du keinen Speicher für @lines und ist zudem viel performanter.
Nun will, sobald die 2 Variablen in die neue Datei liste_anzeige.txt geschrieben wurden, in der liste.txt diese Zeile löschen. Wie mach ich das? Muss ich das '<' vor $root in '>' oder '>>' ändern?
Geht _überhaupt_ nicht. >> = Anfügen, > = neue Datei+schreiben, < = lesen. Siehe auch
perldoc -f open.
Du musst die Datei einlesen, wenn "die 2 Variable" kommt ignorieren und dann alle
"nur 1 Variable" wieder in die Datei speichern (zwei opens, einmal für lesen, dann für
schreiben).
Am effizientesten wäre es wohl, wenn du liste_name und liste_email in einen Hash
(s. perldoc perlfaq4) legst und liste_name'n ignorierst, wenn sie schon im Hash
vorkommen. Dann iterierst du über den Hash und schreibst die Daten zurück in die selbe
Datei (dieses mal die Datei mit '>' geöffnet).
Viele Grüsse
Philipp