Beat: Tester gesucht für Perl Expressions in REs Perl 5.6 - 5.10

Hi

Code Expressions gehören nicht zu den garantierten Verhaltensweisen, wenn in Regulären Expressions vorhanden.

Darf ich freiwillige Tester bitten, das folgende Script auf ihrem verfügbaren Perl zu testen.

Meine eigene Version ist 5.8.6
Mich würden die andere Versionen besonders interessieren.

Der Test sucht nach
  "[", sofern sie nicht durch "" maskiert sind
       und von [a-z]+ ":" gefolgt werden
  "]", sofern sie nicht durch "" maskiert sind
und speichert die Position dieser gültigen Vorkommen.

  
#!usr/bin/perl  
#  
# Test für Parser-Entwicklung  
# Beat Stoecklin, Dez.2008  
  
use warnings;  
use strict;  
  
parser();  
  
sub parser{  
   my $test = '12[p:6\[9[\]]4]6' . "\n" . '8[p:23]4';  
   my $pos = 0; # speichert die Position  
   print "Ein Test zu Code Expressions in Perl RE \nfuer Perl 5.6 bis Perl 5.10.\n\n",  
      "Der Test gilt als bestanden, \nwenn Erwartung und Ermittlung identisch sind.\n",  
      "----------------------------------------------------------------------------",  
      "\n\nOriginaler String :\n", $test,  
      "\n\nErwartete Positionen fuer [ und ] :\n",  
      '[3, ]13, ]15, [19, ]24,',  
      "\n\nErmittelte Positionen fuer [ und ] :\n";  
  
   $test =~ s/  
      (?{$pos++})  
      (?<!\\)  
      (  
         \[(?=[a-z]+:)  
      |  
         \]  
      )  
    / pp( $1, $pos ) /xge;  
  
   print "\n\nDer String nach dem Test :\n", $test,  
      "\n\nBitte geben Sie Erfolg oder Misserfolg, sowie die verwendete Perl Version an.\nDanke",  
      "\n\nENDE mit [Enter]\n";  
   <>;  
}  
  
sub pp {  
   print $_[0], $_[1],', ';  
   return $_[0];  
}  

Darf ich bitten, Erfolg oder Misserfolg, sowie die Perl Version zu melden.

Mit Dank und freundlichen Grüssen
Beat
--

<o(((°>           ><o(((°>

<°)))o><                     ><o(((°>o

  1. Hi,

    getestet am Mac OSX 10.4.11 mit Darwin und perl, v5.8.6 built for darwin-thread-multi-2level

    Originaler String :
    12[p:6[9[]]4]6
    8[p:23]4

    Erwartete Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Ermittelte Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Der String nach dem Test :
    12[p:6[9[]]4]6
    8[p:23]4

    sieht doch gut aus...

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. getestet am Mac OSX 10.4.11 mit Darwin und perl, v5.8.6 built for darwin-thread-multi-2level

      Erwartete Positionen fuer [ und ] :
      [3, ]13, ]15, [19, ]24,

      Ermittelte Positionen fuer [ und ] :
      [3, ]13, ]15, [19, ]24,

      sieht doch gut aus...

      Ja, ist ein positives Resultat. Leider gleiche Version.
      Gut, Betriebssystem verschieden. Weiss nicht ob das eine Rolle spielen könnte für den Test.
      Meins ist ActiveState win32

      Problem mit Code Expressions in m//, sie verhalten sich anders, als man denkt.
      Wenn ich nach ([[]]) statt ([|]) suche, schlägt die Backtracking Falle zu. local $pos in der Expression
          m/ (?{$pos++}) (?<!\) ( [(?=[a-z]+:)|  ] )
      hilft nicht weiter.
      Gerade im Bereich der RE hat sich eine Entwicklung getan zwischen 5.6 und 5.10.

      mit use 5.008 könnte ich leben.

      mfg Beat

      --
      Woran ich arbeite:
      X-Torah
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
  2. Hi,

    Darf ich freiwillige Tester bitten, das folgende Script auf ihrem verfügbaren Perl zu testen.

    Darf ich bitten, Erfolg oder Misserfolg, sowie die Perl Version zu melden.

    Originaler String :
    12[p:6[9[]]4]6
    8[p:23]4

    Erwartete Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Ermittelte Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Der String nach dem Test :
    12[p:6[9[]]4]6
    8[p:23]4

    So schaut es bei mir mit Perl v5.8.8 unter Ubuntu aus.

    mfG,
    steckl

  3. Hi.

    Test bestanden unter:
    v5.8.7, Activstate, Win XP
    v5.8.8 Debian Linux

    In einer persistenten mod_perl Umgebung allerdings, liefert es beim zweiten Aufruf(wenn der Code also bereits im MEM liegt, Stichwort "ModPerl::Registry"):

    Ermittelte Positionen fuer [ und ] :
    [0, ]0, ]0, [0, ]0,

    Ich habs jetzt nicht analysiert, wird aber behebbar sein. Bzgl. Perl selbst passt es ja.

    Grüße

  4. Darf ich bitten, Erfolg oder Misserfolg, sowie die Perl Version zu melden.

    This is perl, v5.10.0 built for MSWin32-x86-multi-thread

    Originaler String :
    12[p:6[9[]]4]6
    8[p:23]4

    Erwartete Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Ermittelte Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Der String nach dem Test :
    12[p:6[9[]]4]6
    8[p:23]4

    Struppi.

  5. Hi nochmal,

    Auch auf meinem Vserver mit Ubuntu mit perl 5.8.7 alles ok...

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
  6. hi,

    Originaler String :
    12[p:6[9[]]4]6
    8[p:23]4

    Erwartete Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Ermittelte Positionen fuer [ und ] :
    [3, ]13, ]15, [19, ]24,

    Der String nach dem Test :
    12[p:6[9[]]4]6
    8[p:23]4

    Wie kriege ich die Versionsnummer raus?

    print $], $/;

    Ergibt: 5.008008

    mfg

    --
    „Wenn du nicht bereit bist, dafür zu sterben, dann streiche das Wort »Freiheit« aus deinem Vokabular.“ -- Malcolm X
    I Have a Dream
    1. Wie kriege ich die Versionsnummer raus?

      perl -v

      Struppi.

      1. hi,

        perl -v

        Danke. Ich habe auch 5.8.8.
        Da scheint ja das, was ich gefunden hatte in die richtige richtung zu gehen, ausser das dass Ergebnis Nullen statt Punkte hat.

        mfg

        --
        „Wenn du nicht bereit bist, dafür zu sterben, dann streiche das Wort »Freiheit« aus deinem Vokabular.“ -- Malcolm X
        I Have a Dream
  7. Hallo

    Erst mal Danke...
    Ich fasse mal zusammen, möchte aber auch betonen, dass ich weitere Tests zur Kenntnis nehmen werde, so lange der Thread nicht im Archiv landet.

    Getestet wurden auf

    • 5.8.6 win32 (Beat)
    • 5.8.6 OSX (Joachim)
    • 5.8.7 Ubuntu VServer (Joachim)
    • 5.8.7 win32 (Dirk)
    • 5.8.8 Ubuntu/Debian (steckl, Dirk)
    • 5.8.8 unknown (Malcolm Becks)
    • 5.10.0 win32 (Struppi)

    Sieht soweit gut aus, und wenn man die Entwicklung betrachtet,
    so ist m/(?{EXPRESSION}) wohl dann sicher, wenn man keine
    Variabeln von ausserhalb importiert.

    Ich weiss noch nicht, was ich aus Dirks Meldung machen soll.
    Kann sein, dass solche Expressions kein guter Kandidat für ModPerl::Registry
    Der Testcase verarbeitete allein Konstanten. Im realen Einsatz
    muss der Parser aber verschiedenen Input ausführen.

    Und der Sinn des Ganzen?
    Es handelt sich um den Kern eines der Versionen von Parsern, die ich teste, die eine [p:c] Struktur nach beschreibbaren Syntaxregeln abarbeiten.
    Der parser darf keine Anforderungen an die Struktur-Tiefe wie in
    [p:[p:[p:[p:[p:[p:...]]]]]] machen, sondern muss erfolgreich den
    Null-Level der äussersten Struktur extrahieren, eine mit p assoziierte Funktion ermitteln, den String übergeben an das entsprechende [p:c] Modul,
    und dieses arbeitet dann wieder den String entweder nach interner Syntax
    ab oder verwendet wiederum den Parser.
    Der Parser kann also rekursiv immer wieder aufgerufen werden, allerdings mit
    immer kleineren Substrings.

    Mit Dank und freundlichen Grüssen
    Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. hi,

      • 5.8.8 unknown (Malcolm Becks)

      Oo, sorry. Das wichtigste wieder vergessen.

      Win XP SP 2

      mfg

      --
      „Wenn du nicht bereit bist, dafür zu sterben, dann streiche das Wort »Freiheit« aus deinem Vokabular.“ -- Malcolm X
      I Have a Dream
  8. Ein Nachwort zum Test

    Ich muss doch für perl 5.8 doch vor m/(?{ CODE })/ sehr warnen.
    Wird die Prozedur, die diese RE enthält rekursiv aufgerufen, wie dies im Falle meines Parsers mt unbeschränkten verschachtelungen der Fall ist, dann verliert eine Variable in CODE ihren Skope.
    Weiter stellte ich fest, dass das ganze auch nicht schnell ist.

    Ich habe nun das Design des Kerns umgebaut. Heraus kam ein um etwa 10 mal schnellerer Parser.

      
    my @p = ();  
    for( $in){  
       while( /  
          (  
            (?<!\\)\[(?=[a-z]+:) # Matche [parametername:  
          |                      # oder  
            (?<!\\)\]            # Matche ]  
          |  
            \n$                  # die letzte Newline, wenn vorhanden  
          |  
             .$                  # irgend ein letztes Zeichen  
          )  
          /xg ){  
          push @p ,$1, pos() - 1;  
       }  
    }  
    while( @p  ){  
       $pp->( shift @p, shift @p );  
    }  
    
    

    Es ist etwas knifflig, an die Perlvariable pos() zu gelangen.
    Hier war es notwendig, den zu prüfenden text in ein
    for() zu stecken.

    Der Parser hat den Rekursionstest bestanden.
    1000 Durchgänge für einen mittleren [p:c] kodierten text in 1.4 bis 1.7 Sekunden, ermittelt mit Time::HiRes.
    (Benchmark versagte an diesem Punkt).

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o