|
|
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
|