Jochen: Zeile aus einer Datei löschen

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

  1. 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);