peter: suchpostion bei mehrmaliger globaler suche zurücksetzen

hallo

mein problem ist sehr warscheinlich das eines anfängers, aber ich stecke fest.

ich muss "$article" (stammt von textdatei) mehrmals global durchsuchen und die ergebnisse speichern. dazu habe ich mehrere for-schleifen, z.b.:

###############################################
for ($i = 0; $i <= $artikelzahl; $i++)
{
 $article =~ m/<IMG SRC="(.*?)"/>/g;
 push (@bild, $1);
}

for ($i = 0; $i <= $artikelzahl; $i++)
{
 $article =~ m/<!--1-->(.*?)<!--2-->/g;
 push (@zeit, $1);
}
###############################################

PROBLEM: bei der zweiten schleife beginnt die suche nicht wieder am anfang von $article (nur wenn ich bei "m/<IMG SRC="(.*?)"/>/g" mittels "?" eine gierige such verhindere.

FRAGE: wie kann man die suchposition im skalar $article zurücksetzen?

vielen dank im voraus
peter

  1. Hallo,

    die Variable $article enthält einen Wert und sonst gar nix. Und eine regex-Suche durchsucht den Variableninhalt und liefert Werte zurück - sonst nix.
    Das Problem muß da woanders liegen.

    Ich verstehe auch überhaupt nicht, was Du da mit den Schleifen willst. Aber solltest Du damit alle Vorkommnisse des gesuchten Patterns aus dem $article nach @bild oder @zeit herausschälen wollen, ist ein Konstrukt wie
    push @bild, $article =~ m/<IMG SRC="(.*?)"/>/g;
    und
    push @zeit, $article =~ m/<!--1-->(.*?)<!--2-->/g;
    sicherlich einfacher; solltest Du aber wirklich nur maximal $artikelzahl zulassen wollen, kannst Du ja die Arrays nachher entsprechend kürzen
    zB: $#bild = ($artikelanzahl-1)

    Ich hoffe, das hilft Dir weiter
       Manfred

    1. thanks a lot! diese form ist tatsächlich viel einfacher:

      push @bild, $article =~ m/<IMG SRC="(.*?)"/>/g;

      bloss leuchtet mir nicht ein, warum sie funktioniert, wäre also auch nicht drauf gekommen. =~ gibt ja bloss wahr oder falsch zurück (und speichert dies in @bild). der wert von (.*?) wird ja in $1 gespeichert; der wird jedoch nirgendwo abgegriffen.

      sorry für mein anfängertum, die schleifen waren in diesem falle tatsächlich überflüssig (wollte bloss alle werte durchgehen und habe das mit while nicht geschafft).

      DANKE!

      1. use Mosche;

        push @bild, $article =~ m/<IMG SRC="(.*?)"/>/g;

        bloss leuchtet mir nicht ein, warum sie funktioniert, wäre also auch nicht drauf gekommen. =~ gibt ja bloss wahr oder falsch zurück (und speichert dies in @bild). der wert von (.*?) wird ja in $1 gespeichert; der wird jedoch nirgendwo abgegriffen.

        Bei m// wird im Array-Kontext eine Liste mit dem Inhalt von $1, $2, ... zurückgegeben.

        ($1, $2, $3, ...) = $article =~ m/...(.*?).../;
        Hier wird dieser Array an @bild hinzugefügt.

        Mehr dazu siehe in 'perldoc perlre'.

        use Tschoe qw(Matti);

      2. Hallo peter

        =~ gibt ja bloss wahr oder falsch zurück (und speichert dies in @bild). der wert von (.*?) wird ja in $1 gespeichert; der wird jedoch nirgendwo abgegriffen.

        Nein, in solchen Fällen werden die Ergebnisse nicht nur in $1, $2,... zurückgeliefert, sondern auch als return-Wert(e), was innerhalb eines if als true gilt (schlägt das Regex fehl, wo wird nichts zurückgeliefert, was im if einem false entspricht).

        zB:
        $a = "abc";
        ($x) = $a =~ /^.(b)/;

        $1 = "b"

        $x = "b"

        ($x,$y) = $a =~ /^(a)(b)/;

        $1 = "a", $2 = "b"

        $x = "a", $y = "b"

        und wenn unbekannt ist, wieviel zurückkommt dann eben
        zB.
        @ret = $a =~ /./g;

        Schau Dir am besten 'mal die Perldokumentation perlre an.

        Manfred

        1. super, eure antworten! dann werde ich mich wohl noch ein wenig mit dem perlre-perldoc auseinandersetzen...