Markus Banach: entfernen von $array[$i]

Liebe Leser,

$string wird ein Wert zugewiesen

foreach (@array) {
                           if ( $_ =~ / ^$string/ ) {
                           $_ =~ s/^$string//;
              # das ist meine "unschoene" Loesung, denn $array[$i]  ist jetzt eine leere Zeile
              # wie aber kann ich $array[$i] ganz aus dem array entfernen ?
                   } }

An dieser Stelle Vielen Dank fuer alle bisherigen Antworten die ich in diesem Forum erhalten habe .

Ich freue mich auf Ihre Beitraege !

Markus Banach

  1. Liebe Leser,

    $string wird ein Wert zugewiesen

    foreach (@array) {
                               if ( $_ =~ / ^$string/ ) {
                               $_ =~ s/^$string//;
                  # das ist meine "unschoene" Loesung, denn $array[$i]  ist jetzt eine leere Zeile
                  # wie aber kann ich $array[$i] ganz aus dem array entfernen ?
                       } }

    An dieser Stelle Vielen Dank fuer alle bisherigen Antworten die ich in diesem Forum erhalten habe .

    Ich freue mich auf Ihre Beitraege !

    Markus Banach

    Hallo Markus,

    1. Lösungsvorschlag:

    lese die Datei (oder das Array @array) ohne die Zeile $string
    auf ein neues Array...

    Bsp.: Datei lesen ohne eine Zeile die "$string" beginnt

    while (<HANDLER>){
    if(!$_ =~ /^$string/){
      push(@array_new, $_);
    }
    }

    Mit @array_new kannst Du dann machen, was Du willst...

    2. Lösungsvorschlag:

    den Listeneintrag des @rrays ans Ende schieben mit "shift(@rray)" und dann löschen mit der Funktion "pop(@rray)".

    Sicher gibts auch noch andere Lsg....
    Für Rechtschreibfehler keine Haftung ;-)

    Servus, kiliani

  2. hi!

    wie aber kann ich $array[$i] ganz aus dem array entfernen ?

    splice

    bye, Frank!

  3. Hi,

    splice wurde ja schon genannt, alternativ dazu kannst Du auch

    @array = @array[0..$i-1,$i+1..$#array];

    schreiben. Ich möchte hier aber mal Deinen Code ein wenig optimieren ;-)

    foreach (@array) {
                               if ( $_ =~ / ^$string/ ) {

    $_ =~ /.../ schreibt man einfach /.../, also:

    if (/^$string/) { # wobei das Leerzeichen nach dem ersten / vermutlich ohnehin falsch ist

    $_ =~ s/^$string//;

    Dito, also einfach s/^$string//;
    Allerdings wird s/x/y/ sowieso nur dann ausgeführt, wenn /x/, also ist die if-Anweisung unnötig... :-) Dein Code könnte also genausogut lauten:

    foreach (@array) {
       s/^$string//;
       ...
    }

    Das nur nebenbei. Natürlich führen wieder viele Wege nach Rom, Deiner ist nicht falsch - ich wollte es nur gesagt haben, weil hier die Optimierung förmlich ins Auge sticht ;-)

    Cheatah

    P.S.: Ich verwende bewußt auch lieber "$_ =~ /.../", weil man dann eher sieht, was passiert. Außerdem ersetze ich $_ gewöhnlich auch durch eine eigene Variable ("foreach $foo (@array)"), es ist einfach einsichtiger!