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