|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander V. Gaiduk 2:5020/400 04 Mar 2008 11:03:20 To : Artem Chuprina Subject : Re: баг Перла или баг мозга? -------------------------------------------------------------------------------- > >> В скалярном контексте модификатор /g оставляет в строке закладку. > >> Следующий заход на ту же строку начнется с того места, где закончился > >> предыдущий. За счет этого работает идиома > >> > >> while ($string =~ /.../g) > >> > >> if, соответственно, задает скалярный контекст. > > AVG> ладно, хорошо, пусть закладка остаётся, в данном случае > AVG> на конце строки. но ведь дальше начинает выполняться > AVG> _другой_ регэксп на эту же переменную: > > AVG> @array = $g =~ m!<pp>(.+?)</pp>!sg > > AVG> почему та закладка тогда не сбрасывается? > > Потому что закладка в строке, а не в регекспе. Именно с тем расчетом, > чтобы можно было потом пустить туда другой регексп. Спецсимвол \G > знаешь? фигасе! хотя это ведь правильно, и удобно, блин! теперь надо еще и это иметь в виду :) > >> Дальше объяснять? > > AVG> было бы здорово, если тока не трудно. > AVG> блин, век живи - век учись. > > m//g в скалярном контексте работает следующим образом. Он ожидает, что > следующий регексп (неважно, такой же или другой) ты захочешь начать > матчить с того места, на котором остановился этот (если он не отматчился > - то с того места, с которого он начинал). Потому что если ты этого не > хотел, то на кой ты писал модификатор g в скалярном-то контексте? да лопухнулся я с //g. оказывается Ларри более глубоко продумал язык, чем мне казалось :) > Эта схема позволяет, скажем, довольно удобно разбирать всякие языки. > > Применительно к твоему случаю, тебе был бы нужен модификатор g, если бы > для тебя было важно, что z идет после всех p, а x - до. При этом еще > надо было бы отдельно станцевать с \G, если случайно встретившийся до > всех p z должен считаться ошибкой, а не просто быть тупо проигнорирован. > А если тебе порядок пофигу, то модификатор ты туда прикрутил по дури, о > чем тебе perl со свойственной ему лаконичностью :-) и рассказал. ага. спасиб за разьяснения. > -- > Artem Chuprina > RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru -- С уважением, Александр Гайдук, вебмастер мэрии Архангельска $_='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/338792dc73681.html, оценка из 5, голосов 10
|