pondělí 12. března 2007

Perl a regulární výrazy s (?g)

Perl 5.6 měl při zpracování regulárních výrazů jednu pěknou nedokumentovanou vlastnost, která ve verzi 5.8 přestala fungovat.
V Perlu je možné modifikátory regulárního výrazu vložit přímo do samotného regulárního výrazu. Např. výraz odpovídající "a" bez ohledu na velikost písmen se dá napsat jako /a/i nebo se modifikátor může vložit přímo do výrazu jako /(?i)a/. To se hodí, pokud výraz není součástí zdrojového kódu, ale pochází odjinud.
Perl 5.6 neměl nic proti tomu, pokud se i modifikátor globálního hledání //g vložil do výrazu jako /(?g)/ a všechno fungovalo, jak má, i když v dokumentaci to nebylo nikde popsáno. Perl 5.8 se to ovšem rozhodl změnit a mě připravit opravdu perné chvilky :)

Následující příklad funguje jen v Perlu 5.6:
while ('xabyaczad' =~ m/(?g)a(.)/) { print $1; }

Pro Perl 5.8 je potřeba g "vytáhnout ven":
while ('xabyaczad' =~ m/a(.)/g) { print $1; }

Laskaví uživatelé RSS feedů nechť přijmou omluvu za několikadenní výpadek a za pomoc při řešení děkuju Marovi a Stěpánkovi.

Žádné komentáře:

Okomentovat