Thomas Haller: öffnen einer Datei und eine Zeile löschen (Die 2-te)

Hi!

Ich ich folgendes Problem: (Quellcode siehe unten)
1.) Ich möchte einen User aus einer Datei "test.txt" löschen.
2.) Login steht jeweils in einer neuen Zeile.

So nun, wie man unten erkennen kann wird die Datei geöffnet, usw...
(Quellcode nicht 100% von mir, sonst würde ich das nicht posten müssen)

Was die Sache machen soll? Naja, eine bestimmte Zeile (Login) aus der
Datei löschen. (ein Login, eine Zeile)
Es gilingt mir aber nicht so recht, ausserdem löscht der unten stehende
Quellcode immer nur die erste Zeile ?!

Könnte mir hier jemand den Fehler sagen, bzw. einen Tipp geben
wie das ander zu machen ist?

Vielen Dank für jede Antwort!

MfG Thomas

#######  Anfang der File ########
[...]

sub remove {

open (data, "<test.txt") or &error("fehler");
@data=<data>;
close(data);
$count=0;
foreach $data(@data) {
$count++;
@datax=split(/:/, $data); # möchte nicht bei ":" splitten, sondern jeweils mit einer neuen Zeile
if ($INPUT{'test'} eq "@datax[0]" and $INPUT{'test'}== "@datax[0]") {
$count--;
splice (@data, $count, 1);
open (wdata, ">test.txt") or &error("fehler");
}
print wdata @data;
close(wdata);
print "User gelöscht.";
exit;
}

[...]

######## EOF ############

  1. Hi!

    Hallo

    Es gilingt mir aber nicht so recht, ausserdem löscht der unten stehende
    Quellcode immer nur die erste Zeile ?!

    wenn die Zeile die du löschen willst ein Merkmal hat, das sie von den anderen Zeilen unterscheidet, zbsp $wort[0], dann kannst du mit if abfragen ob das merkmal in einer Zeile vorkommt und dann mit suchen/ersetzen die Zeile durch nichts ersetzen. In der selfhtml-doku unter perl beschrieben.
    Ich glaube, das ist dein Problem, habe aber auch noch nicht soo viel erfahrung mit perl.

    Grüsse von Judith

    Könnte mir hier jemand den Fehler sagen, bzw. einen Tipp geben
    wie das ander zu machen ist?

    Vielen Dank für jede Antwort!

    MfG Thomas

    #######  Anfang der File ########
    [...]

    sub remove {

    open (data, "<test.txt") or &error("fehler");
    @data=<data>;
    close(data);
    $count=0;
    foreach $data(@data) {
    $count++;
    @datax=split(/:/, $data); # möchte nicht bei ":" splitten, sondern jeweils mit einer neuen Zeile
    if ($INPUT{'test'} eq "@datax[0]" and $INPUT{'test'}== "@datax[0]") {
    $count--;
    splice (@data, $count, 1);
    open (wdata, ">test.txt") or &error("fehler");
    }
    print wdata @data;
    close(wdata);
    print "User gelöscht.";
    exit;
    }

    [...]

    ######## EOF ############

  2. Hi!

    Ich ich folgendes Problem: (Quellcode siehe unten)
    1.) Ich möchte einen User aus einer Datei "test.txt" löschen.
    2.) Login steht jeweils in einer neuen Zeile.

    So nun, wie man unten erkennen kann wird die Datei geöffnet, usw...
    (Quellcode nicht 100% von mir, sonst würde ich das nicht posten müssen)

    Hm, sieht ein bisschen umständlich aus... (Und: was passiert, wenn die
    gesuchte Zeile gar nicht vorkommt? Beim Aufruf von "print wdata @data"
    wäre wdata ja gar nicht geöffnet!)

    Sonst probier das mal:

    sub remove
    {
    my($file,$str) = @_;
    my @data = ();

    open(DATA, $file) or &error("fehler");  
    while(<DATA>)  
    {  
    

    push(@data,$_) unless $_ =~ /$str/;
    }
    close DATA;

    open(WDATA, ">$file") or &error("fehler");  
    print WDATA @data;  
    close WDATA;  
    

    }

    &remove(DATEI, STRING) löscht dann aus DATEI alle Zeilen, in denen
    STRING vorkommt. Aufruf z. B.: &remove("test.txt","Login");

    Ciao,
      Alex

  3. Hi!

    Ich ich folgendes Problem: (Quellcode siehe unten)
    1.) Ich möchte einen User aus einer Datei "test.txt" löschen.
    2.) Login steht jeweils in einer neuen Zeile.

    So nun, wie man unten erkennen kann wird die Datei geöffnet, usw...
    (Quellcode nicht 100% von mir, sonst würde ich das nicht posten müssen)

    Was die Sache machen soll? Naja, eine bestimmte Zeile (Login) aus der
    Datei löschen. (ein Login, eine Zeile)
    Es gilingt mir aber nicht so recht, ausserdem löscht der unten stehende
    Quellcode immer nur die erste Zeile ?!

    Könnte mir hier jemand den Fehler sagen, bzw. einen Tipp geben
    wie das ander zu machen ist?

    Vielen Dank für jede Antwort!

    MfG Thomas

    #######  Anfang der File ########
    [...]

    sub remove {

    open (data, "<test.txt") or &error("fehler");
    @data=<data>;
    close(data);
    $count=0;
    foreach $data(@data) {
    $count++;
    @datax=split(/:/, $data); # möchte nicht bei ":" splitten, sondern jeweils mit einer neuen Zeile
    if ($INPUT{'test'} eq "@datax[0]" and $INPUT{'test'}== "@datax[0]") {
    $count--;
    splice (@data, $count, 1);
    open (wdata, ">test.txt") or &error("fehler");
    }
    print wdata @data;
    close(wdata);
    print "User gelöscht.";
    exit;
    }

    [...]

    ######## EOF ############

    Moin, moin,
    ich würde es so lösen:

    ################
    $datei = "test.txt";
    $wert = "das_was_gelöscht_wird";

    sub remove {

    ############

    Datei öffnen, in Array einlesen, schließen

    ############
    open(DATA,"$datei") die $!;
    @data1 = <DATA>;
    close(DATA);

    ############

    Datei zum Schreiben öffnen,

    Array zeilenweise abarbeiten und vergleichen ob $Wert vorkommt,

    wenn ja, dann "next"

    ansonsten die Zeile in die Datei schreiben

    ############

    open(DATA,">$datei") die $!;
    foreach $zeile (@data1)
    {
      chomp($zeile);
      if($zeile eq "$wert") { next }
      else { print DATA "$zeile\n" }
    }
    close(DATA);

    open(DATA,"<$datei") die $!;
    @data2 = <DATA>;
    close(DATA);
    print "User: $wert gelöscht";
    }
    #################

    Grüße
    Steffen D.