Zeile aus einer Datei löschen
Jochen
- perl
Hallo,
es gibt eine Datei namens email.dat
In dieser Datei sind eMailadressen untereinander aufgelistet.
Wie mache ich das, dass ich einzelne adresse löschen kann?
also in etwa so:
$email = "$in{'email'}";
$datei = "email.dat";
if $email in der datei vorhanden {
dann lösche $email aus der $datei
} else {
&emailnichtvorhanden;
}
Kann mir jemand mal dieses Beispiel berichtigen? ;-)
Ich danke Euch jetzt schonmal!
Gruß, Jochen
use Mosche;
Wie mache ich das, dass ich einzelne adresse löschen kann?
$email = "$in{'email'}";
Es spart Zeit (sowohl Programmier- als auch Ausführungszeit) wenn du einfach
$email = $in{'email'}
angeben würdest. Außerdem schließe ich anhand des Namens deines Hashes (%in), dass du ein Programm über CGI schreibst, welches nicht CGI.pm benutzt. Ich empfehle dir aber, dies zu tun.
$datei = "email.dat";
if $email in der datei vorhanden {
dann lösche $email aus der $datei
} else {
&emailnichtvorhanden;
}
Das ist doch eigentlich ganz logisch - auf die Schnelle 2 Varianten: eine zum erklären, die andere zum benutzen (weil sie schneller ist).
1. Erklärvariante
Du öffnest deine Datei, liest sie Schritt für Schritt aus und tust sie in einen Array, außer wenn es die gesuchte Adresse ist.
my $email = 'blah@blah.de';
my @lines;
open(FH, $datei) or die "Kann $datei nicht oeffnen: $!";
while(<FH>) {
chomp;
push(@lines, $_) unless $_ eq $email;
}
close(FH);
open(FH, ">$datei") or die "Kann $datei nicht zum Schreiben oeffnen: $!";
# jedes print() mit newline abschliessen
$\ = "\n";
# alles emails neu schreiben
print FH for @lines;
close(FH);
2. Variante
Beim auslesen der Datei wird eine temp. Datei gleich neu geschrieben und dann umkopiert.
use File::Copy;
my $tmp = 'blah.tmp';
$="\n";
open(FH, $datei) or die "Kann $datei nicht oeffnen: $!";
open(FH2, $tmp ) or die "Kann $tmp nicht zum Schreiben oeffnen: $!";
while(<FH>) {
chomp;
print FH2 unless $_ eq $email;
}
close(FH);
close(FH2);
move($tmp, $datei);
use Tschoe qw(Matti);