Tester gesucht für Perl Expressions in REs Perl 5.6 - 5.10
Beat
- perl
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
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
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
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
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
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.
Hi nochmal,
Auch auf meinem Vserver mit Ubuntu mit perl 5.8.7 alles ok...
Gruesse, Joachim
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
Wie kriege ich die Versionsnummer raus?
perl -v
Struppi.
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
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
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
hi,
- 5.8.8 unknown (Malcolm Becks)
Oo, sorry. Das wichtigste wieder vergessen.
Win XP SP 2
mfg
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