Perl 5.10 RE, zejmena asi chybne chovani (?|...)
Pavel Smerk
xsmerk na fi.muni.cz
Středa Leden 9 10:39:24 CET 2008
Ahoj vespolek.
Lze po provedeni $a =~ /RE/ nejak ziskat pole obsahu capture buffers, aniz
bych vedel, kolik jich je? Jakoze totez, co =~ v tomto pripade vrati jako
navratovou hodnotu. Nebo musim vzdy udelat nejake @tmp = $a =~ /RE/?
No ale zejmena, nejak mi nefunguje (?|...), tak by me zajimalo, jestli je to
jen u me, nebo "jestli je zavada v celym baraku". Vypada to totiz, ze pokud
by mela matchovat posledni alternativa, ve ktere je vic capture groups nez v
predchozich alternativach, tak to spadne, nebo aspon ty skupiny naplni blbe:
$ ~/perl/bin/perl -v
This is perl, v5.10.0 built for i686-linux
Spadne, pokud za (?|...) uz neni alespon tolik (), o kolik ma namatchovana
posledni alternativa vic nez predchozi alternativy (pred (?|...) mohou byt):
$ ~/perl/bin/perl -E 'say "a" =~ /(?|(a)|(b)(.*))/'
a
$ ~/perl/bin/perl -E 'say "b" =~ /(?|(a)|(b).*)/'
b
$ ~/perl/bin/perl -E 'say "b" =~ /(?|(a)|(b)(.*))/'
b
*** glibc detected *** /home/xsmerk/perl/bin/perl: munmap_chunk(): invalid pointer: 0x0816aaf8 ***
[... (Backtrace a Memory Map)]
$ ~/perl/bin/perl -E 'say "b" =~ /(.*)(?|(a)|(b)(.*))/'
b
*** glibc detected *** /home/xsmerk/perl/bin/perl: free(): invalid next size (fast): 0x0816a638 ***
[...]
$ ~/perl/bin/perl -E 'say "b" =~ /(.*)(?|(a)|(b)(.*))(.*)/'
b
Ovsem i pokud to nespadne, protoze skupiny za (?|...) "dorovnaly" pocet,
nenaplni se spravne:
$ ~/perl/bin/perl -E 'say "bc" =~ /(.*)(?|(a)|(b)(.*))(.*)$/'
b
Nebude-li to posledni alternativa, zda se vse byt OK nezavisle na poctu ():
$ ~/perl/bin/perl -E 'say "b" =~ /(?|(a)|(b)(.*)|(*F))/'
b
$ ~/perl/bin/perl -E 'say "b" =~ /(.*)(?|(a)|(b)(.*)|(*F))/'
b
$ ~/perl/bin/perl -E 'say "bc" =~ /(.*)(?|(a)|(b)(.*)|(*F))$/'
bc
Pokud se ale chci nejak odkazovat na pojmenovane skupiny, nefunguje to
(zrovna tohle nespadne, ale napr. b|b misto \g{n}|b spadne) a nenasel jsem
ani workaround:
$ ~/perl/bin/perl -E 'say "cb" =~ /(?|(a)(?<n>(?(<n>)\g{n}|b))|(c)(?<n>(?(<n>)\g{n}|b)))/'
cb
$ ~/perl/bin/perl -E 'say "cb" =~ /(?|a(?<n>(?(<n>)\g{n}|b))|(c)(?<n>(?(<n>)\g{n}|b)))/'
$ ~/perl/bin/perl -E 'say "cb" =~ /(?|a(?<n>(?(<n>)\g{n}|b))|(c)(?<n>(?(<n>)\g{n}|b))|(*F))/'
Nebo jsem spatne cetl dokumentaci a delam neco blbe ja?
Tak prosim kdyz tak nekdo zkuste, jestli se vam to chova taky tak. Pokud je
nekdo (no, asi nejspis Adelton :-) zbehly v bugreportovani, ze by mu to
nezabralo cas, tak by samozrejme bylo nejlepsi, kdyby to ohlasil na vhodna
mista, abych nemusel zjistovat, jak se to spravne dela. :)
Mejte se, P.
Další informace o konferenci Perl