Chris: $1 behält Wert zulange

Hallihallo,

ich habe mehrere RegExp, die ich nacheinander auf verschiedene Strings anwende, um bestimmte Teile herauszuparsen. Nun kann es aber auch vorkommen, dass ein RegExp überhaupt nicht matcht und dann habe ich in $1 nicht etwa undef stehen, sondern das Ergebnis des vorigen RegExp. Wie kann man das umgehen?

Folgende Struktur habe ich:

  
$s1 =~ m/foo(.*?)foo/;  
$res1 = $1;  
  
$s2 =~ m/bar(.*?)bar/;  
$res2 = $1;  

Wenn nun $s2 nicht matcht, dann steht in $res2 das Ergebnis des ersten RegExp, obwohl '' oder undef viel besser wäre.

In perldoc perlre gibt es nur eine Notiz, dass das Verhalten von $[1..9] so gewollt ist und meistens auch praktisch ist. Nur hier ist es das nicht :)

Grüße
Chris

  1. gudn tach!

      
    $res1 = $1 if $s1 =~ m/foo(.*?)foo/;  
    $res2 = $1 if $s2 =~ m/bar(.*?)bar/;
    

    so?

    prost
    seth

    1. $res1 = $1 if $s1 =~ m/foo(.?)foo/;
      $res2 = $1 if $s2 =~ m/bar(.
      ?)bar/;

      oder geht das?  
      ~~~perl
        
      ( $res1 ) = ( $s1 =~ m/foo(.*?)foo/ );  
      ( $res2 ) = ( $s2 =~ m/bar(.*?)bar/ );  
      
      
      1. Hallo!

        oder geht das?

        ( $res1 ) = ( $s1 =~ m/foo(.?)foo/ );
        ( $res2 ) = ( $s2 =~ m/bar(.
        ?)bar/ );

          
        Vermutlich nicht. Zum einen wirft die Suche soviel ich weiß nur dann eine Liste zurück, wenn ein 'g' in den Parametern vorkommt, zum anderen würde dann in den Variablen das gesamte Suchmuster, und nicht nur der gesuchte Ausschnitt stehen. Ein  
        `my ( $res ) = $s1 =~ /(?<=foo).*?(?=bar)/g;`{:.language-perl}  
        Könnte noch funktionieren. Aber auch nur, wenn 'foo' und 'bar' eine feste Länge haben.  
          
        Grüße, Skrilax
        
        1. Vermutlich nicht.

          Das nehme ich zurück. Ich vergaß, dass er ohne 'g' die Klammerwerte in einer Liste zurückgibt. Ok, geht doch. ;)

          Grüße, Skrilax

  2. Hallo.

    Wie kann man das umgehen?

    Probier' es mal so:

    $res1 = $s1 =~ m/foo(.*?)foo/ ? $1 : undef;  
    $res2 = $s2 =~ m/bar(.*?)bar/ ? $1 : undef;
    

    Wenn die regex greift, wird der Wert aus $1 verwendet, ansonsten undef.

    Schöne Grüße.

    1. Danke!
      Manchmal sieht man die einfachsten Sachen nicht :-)