Matti Maekitalo: Zeile aus einer Datei löschen

Beitrag lesen

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