Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Artem Chuprina                       2:5020/400     03 Mar 2008  15:50:14
 To : Alexander V. Gaiduk
 Subject : Re: баг Перла или баг мозга?
 -------------------------------------------------------------------------------- 
 
 Alexander V. Gaiduk  @ Mon, 3 Mar 2008 09:12:38 +0000 (UTC):
 
  AVG> доброго времени суток.
 
  AVG> пописывая на выходных свою парсилку натолкнулся на один
  AVG> очень прикольный глюк. с одной стороны похоже на баг Перла,
  AVG> с другой неправомерное использование спискового контекста
  AVG> совместно с регулярными выражениями.
 
  AVG> кароче, я добился 100% повторяемости этого глюка,
  AVG> вот исходник:
 
  AVG> --8<-------------------------------------------------------------
  AVG> #!/usr/bin/perl -w
  AVG> use strict;
 
  AVG> my $page = q{
  AVG> <gg>
  AVG>    <xx>x01</xx>
  AVG>    <px>
  AVG>        <pp>p11</pp>
  AVG>        <pp>p12</pp>
  AVG>        <pp>p13</pp>
  AVG>    </px>
  AVG>    <zz>z01</zz>
  AVG> </gg>
  AVG> <gg>
  AVG>    <xx>x01</xx>
  AVG>    <px>
  AVG>        <pp>p21</pp>
  AVG>        <pp>p22</pp>
  AVG>        <pp>p23</pp>
  AVG>    <px>
  AVG>    <zz>z02</zz>
  AVG> </gg>
  AVG> <gg>
  AVG>    <xx>x01</xx>
  AVG>    <px>
  AVG>        <pp>p31</pp>
  AVG>        <pp>p32</pp>
  AVG>        <pp>p33</pp>
  AVG>    <px>
  AVG>    <zz>z03</zz>
  AVG> </gg>
  AVG> };
 
  AVG> foreach my $g ($page =~ m!<gg>(.+?)</gg>!sg) {
 
  AVG>    my $xx = $1 if ($g =~ m!<xx>(.+?)</xx>!sg);
  AVG>    my $zz = $1 if ($g =~ m!<zz>(.+?)</zz>!sg);  # **
 
  AVG> #    my $g = $g;
  AVG>    my $pp = '';
  AVG>    foreach my $p ($g =~ m!<pp>(.+?)</pp>!sg) { $pp .= "($p)"; }
 
  AVG>    print "ZZ: $zz\n";
  AVG>    print "XX: $xx\n";
  AVG>    print "PP: $pp\n";
  AVG> }
 
  AVG> --8<-------------------------------------------------------------
 
  AVG> 1. если раскоментировать фрагмент "my $g = $g;" - работает правильно.
 
  AVG> 2. если в регэкспе (помеченом **) убрать модификатор "g"
  AVG> работает правильно.
 
  AVG> 3. если в данных блок "<zz>...</zz>" поднять над блоком <px>...<.px>
  AVG> работает правильно.
 
  AVG> в текущей версии работает неправильно.
 
  AVG> у кого какие соображения будут по этому поводу?
 
 В скалярном контексте модификатор /g оставляет в строке закладку.
 Следующий заход на ту же строку начнется с того места, где закончился
 предыдущий.  За счет этого работает идиома
 
 while ($string =~ /.../g)
 
 if, соответственно, задает скалярный контекст.
 
 Дальше объяснять?
 
 -- 
 Artem Chuprina
 RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru
 
 When C++ is your hammer, everything looks like a thumb
 -- Latest seen from Steven M. Haflich, in c.l.l
 
 --- ifmail v.2.15dev5.4
  * Origin: Leninsky 45 home network (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 баг Перла или баг мозга?   Alexander V. Gaiduk   03 Mar 2008 13:12:38 
 Re: баг Перла или баг мозга?   Andrei Protasovitski   03 Mar 2008 13:01:46 
 Re: баг Перла или баг мозга?   Alexander V. Gaiduk   03 Mar 2008 15:17:52 
 Re: баг Перла или баг мозга?   Artem Chuprina   03 Mar 2008 15:58:47 
 Re: баг Перла или баг мозга?   Andrei Protasovitski   03 Mar 2008 16:00:47 
 Re: баг Перла или баг мозга?   Alexander V. Gaiduk   04 Mar 2008 10:53:11 
 Re: баг Перла или баг мозга?   Artem Chuprina   04 Mar 2008 12:38:27 
 Re: баг Перла или баг мозга?   Artem Chuprina   03 Mar 2008 15:50:14 
 Re: баг Перла или баг мозга?   Alexander V. Gaiduk   03 Mar 2008 18:57:40 
 Re: баг Перла или баг мозга?   Artem Chuprina   03 Mar 2008 20:40:09 
 Re: баг Перла или баг мозга?   Alexander V. Gaiduk   04 Mar 2008 11:03:20 
 нескалярный контекст   Dmitry E. Oboukhov   04 Mar 2008 11:17:18 
 Re: нескалярный контекст   Andrei Protasovitski   04 Mar 2008 11:35:52 
 Re: нескалярный контекст   Orlovsky Alexander   04 Mar 2008 19:54:25 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 11:15:47 
 Re: нескалярный контекст   Andrei Protasovitski   05 Mar 2008 12:03:22 
 Re: нескалярный контекст   Artem Chuprina   05 Mar 2008 15:37:03 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 16:16:07 
 Re: нескалярный контекст   Artem Chuprina   05 Mar 2008 14:13:25 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 15:35:14 
 Re: нескалярный контекст   Artem Chuprina   05 Mar 2008 16:45:55 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 17:14:55 
 Re: нескалярный контекст   Artem Chuprina   05 Mar 2008 17:43:33 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 18:01:33 
 Re: нескалярный контекст   Ilya Anfimov   05 Mar 2008 19:26:07 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 19:54:28 
 Re: нескалярный контекст   Ilya Anfimov   05 Mar 2008 20:27:16 
 нескалярный контекст   Dmitry E. Oboukhov   05 Mar 2008 22:10:22 
 Re: нескалярный контекст   Artem Chuprina   04 Mar 2008 12:51:37 
Архивное /ru.perl/53241777c9dab.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional