xNeTworKx: $1 wird nicht gelöscht ?

Hallo,
ich habe da ein ziemlich merkwürdiges Problem, und zwar muss ich einen String nach <reply>.+?</reply> absuchen.

foreach ($in =~ /(<reply>.+?</reply>)/sg)  {
    push @replies, $1;
    }
Jetzt passiert aber etwas ziemlich merkwürdiges. Wenn ich mit @replies ausgeben lasse, bekomme ich 5 Mal das gleiche <reply>  (Insgesamt kommt <reply>.+?</reply> 5 Mal vor, aber jedes reply ist verschieden). Wenn ich das "g" wegnehme, zeigt er mir nur das erste reply an. Wenn ich "if"  mit "g" in Kombination verwende, zeigt er mir auch nur den ersten reply an. Wie kann das erstens sein ? und warum wird mir bei der ersten Methode 5 Mal das gleiche angezeigt ?

  1. Hi,

    Wenn ich mit @replies ausgeben lasse, bekomme ich 5 Mal das gleiche <reply>

    ich vermute, das liegt daran, dass Du foreach statt while benutzt... ;-)

    Cheatah

    1. Hallo,

      ich vermute, das liegt daran, dass Du foreach statt while benutzt... ;-)

      Nun gut, jetzt funktioniert es, :), aber ich habe es schon vorher mal mit while probiert.Ich weis zwar nicht warum, aber da produzierte ich irgendwie eine Endlosschleife und musst Perl mit dem Task Manager beenden. Deswegen habe ich es zuerst gar nicht nochmal mit while probiert.

      1. Nachtrag :

        Ich wollte noch fragen, warum das eigentlich mit if(.../regExpr./g) nicht klappt, da mit g doch nach allen Vorkommen gesucht wird ?

        1. Hi,

          wenn Du bei while eine Endlosschleife produziert hast, war das vermutlich nur ein Tippfehler...

          Ich wollte noch fragen, warum das eigentlich mit if(.../regExpr./g) nicht klappt, da mit g doch nach allen Vorkommen gesucht wird ?

          if wartet nur auf eine wahre boole'sche Bedingung, und die ist bei mehreren Vorkommnissen der Expression genauso gegeben, wie bei nur einem Vorkommen (die Regular Expression liefert unabhängig von /g etwas zurück, dass nicht unwahr ist). Das /g macht auch nur Sinn, wenn Du eine while-Schleife benutzt - die bei s/// implizit ist.

          Cheatah

  2. Hoi,

    foreach ($in =~ /(<reply>.+?</reply>)/sg)  {
        push @replies, $1;
        }

    Warum schreibst du nicht

    my @replies = $in =~ /(<reply>.+?</reply>)/sg);

    IMHO viel kuerzer und ausserdem *sehr* schnell.

    Gruesse,
     CK