Beat: Ein kritisches Nachwort zu m/(?{ CODE })/

Beitrag lesen

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