|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander V. Gaiduk 2:5020/400 03 Mar 2008 13:12:38 To : All Subject : баг Перла или баг мозга? -------------------------------------------------------------------------------- доброго времени суток. пописывая на выходных свою парсилку натолкнулся на один очень прикольный глюк. с одной стороны похоже на баг Перла, с другой неправомерное использование спискового контекста совместно с регулярными выражениями. кароче, я добился 100% повторяемости этого глюка, вот исходник: --8<------------------------------------------------------------- #!/usr/bin/perl -w use strict; my $page = q{ <gg> <xx>x01</xx> <px> <pp>p11</pp> <pp>p12</pp> <pp>p13</pp> </px> <zz>z01</zz> </gg> <gg> <xx>x01</xx> <px> <pp>p21</pp> <pp>p22</pp> <pp>p23</pp> <px> <zz>z02</zz> </gg> <gg> <xx>x01</xx> <px> <pp>p31</pp> <pp>p32</pp> <pp>p33</pp> <px> <zz>z03</zz> </gg> }; foreach my $g ($page =~ m!<gg>(.+?)</gg>!sg) { my $xx = $1 if ($g =~ m!<xx>(.+?)</xx>!sg); my $zz = $1 if ($g =~ m!<zz>(.+?)</zz>!sg); # ** # my $g = $g; my $pp = ''; foreach my $p ($g =~ m!<pp>(.+?)</pp>!sg) { $pp .= "($p)"; } print "ZZ: $zz\n"; print "XX: $xx\n"; print "PP: $pp\n"; } --8<------------------------------------------------------------- 1. если раскоментировать фрагмент "my $g = $g;" - работает правильно. 2. если в регэкспе (помеченом **) убрать модификатор "g" работает правильно. 3. если в данных блок "<zz>...</zz>" поднять над блоком <px>...<.px> работает правильно. в текущей версии работает неправильно. у кого какие соображения будут по этому поводу? -- С уважением, Александр Гайдук, вебмастер мэрии Архангельска $_='p<5H1>45BO&]Ov194E;Ok71Fo1B839DI]BEm';tr#\x20-~#P-~\x20-O#;print; --- ifmail v.2.15dev5.4 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/33787c23d1866.html, оценка из 5, голосов 10
|