MudGuard: Schleife über m//g mag nicht so wie ich

Hi,

  
use strict;  
use warnings;  
  
my $teststring = "xaysdfasldfasfxbyoiuwrwerx1yasdfsadfsadf";  
  
while ($teststring =~ m~\Gx(.)y~g)  
{  
	print "found $1 between x and y \n";  
}  

sollte m.E. ausgeben:

found a between x and y
found b between x and y
found 1 between x and y

Leider wird aber nur

found a between x and y

ausgegeben.

Ohne das \G bekomme ich endlos
found a between x and y
found a between x and y
found a between x and y
ausgegeben, weil das Matching immer wieder am Stringanfang beginnt - ist ja auch logisch.

Das \G sollte eigentlich dafür sorgen, daß beim zweiten Mal eben nicht am Stringanfang, sondern nach dem ersten Match zu suchen begonnen wird.
Aber es wird kein zweites Mal gematcht.
Und das verstehe ich nicht.

Kann mir bitte jemand auf die Sprünge helfen?

Danke,
cu,
Andreas

--
Warum nennt sich Andreas hier MudGuard?
O o ostern ...
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  1. Hi,

    my $teststring = "xaysdfasldfasfxbyoiuwrwerx1yasdfsadfsadf";
    while ($teststring =~ m~\Gx(.)y~g)

    Aargh, wie dumm von mir.
    Die zweite Fundstelle steht ja nicht (notwendigerweise) unmittelbar nach der ersten, also muß es m~\G.*?x(.)y~g heißen, sprich .*? für beliebige Zeichen zwischen letzter und nächster Fundstelle.

    Dann klappt's auch so wie erwartet.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Hallo MudGuard!

    Ohne das \G bekomme ich endlos
    found a between x and y
    found a between x and y
    found a between x and y

    Ich nicht:

    C:>perl -w

    use strict;  
    use warnings;  
      
    my $teststring = "xaysdfasldfasfxbyoiuwrwerx1yasdfsadfsadf";  
      
    while ($teststring =~ m~x(.)y~g)  
    {  
            print "found $1 between x and y \n";  
    }
    

    ^Z
    found a between x and y
    found b between x and y
    found 1 between x and y

    C:>

    Kann mir bitte jemand auf die Sprünge helfen?

    Hier leider nicht, habe ich mich mit \G doch kaum beschäftigt, da müsste ich mich selbst erstma reinlesen...

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
    1. Hi,

      Ohne das \G bekomme ich endlos
      found a between x and y
      found a between x and y
      found a between x and y

      Ich nicht:

      Ich auch nicht, ich hatte zuerst das g am Ende vergessen ==> Endlos-Ausgabe.
      Um das zu flicken, hatte ich das \G eingeführt - statt einfach das g anzuhängen ...

      Natürlich geht's auch ohne das \G.*? ...

      Irgendwie ist heute ein Sch...Tag. Im wahrsten Sinne des Wortes (mein Verdauungstrakt schiebt heute alles direkt durch ...)

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Hallo MudGuard!

        Irgendwie ist heute ein Sch...Tag. Im wahrsten Sinne des Wortes (mein Verdauungstrakt schiebt heute alles direkt durch ...)

        Kein Wunder, denn mehr oder weniger ist auch die Verdauung vom Gehirn gesteuert. Wenn Du da lauter $kalare und @rrays oder seltsame Strings hast, und dann auch noch einen Fehler, bringt es alles durcheinander :)

        Komputer ausschalten, und eine kleine Winterreise[1] unternehmen!

        [1] Hunsrück, Taunus.

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  3. Das \G steht für die stelle die pos() beschreibt, und ich kann mir wirklich nicht vorstellen wozu du es hier brauchst.

      DB<1> $teststring = "xaysdfasldfasfxbyoiuwrwerx1yasdfsadfsadf";  
      
      DB<2> print $1 while ($teststring =~ m/x(.)y/g)  
    ab1  
    
    

    funktioniert einwandfrei!

    grüße
      rolf

    1. Hi,

      Das \G steht für die stelle die pos() beschreibt, und ich kann mir wirklich nicht vorstellen wozu du es hier brauchst.

      Siehe dieses Posting

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Hi

        Siehe dieses Posting

        hatte ich gelesen, aber ... ich glaube ich muss mich wieder an die hiesige Sortierung gewöhnen um zu sehen was das neueste Posting ist ...