|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 03 Mar 2008 20:40:09 To : Alexander V. Gaiduk Subject : Re: баг Перла или баг мозга? -------------------------------------------------------------------------------- Alexander V. Gaiduk -> Artem Chuprina @ Mon, 3 Mar 2008 14:57:40 +0000 (UTC): >> В скалярном контексте модификатор /g оставляет в строке закладку. >> Следующий заход на ту же строку начнется с того места, где закончился >> предыдущий. За счет этого работает идиома >> >> while ($string =~ /.../g) >> >> if, соответственно, задает скалярный контекст. AVG> ладно, хорошо, пусть закладка остаётся, в данном случае AVG> на конце строки. но ведь дальше начинает выполняться AVG> _другой_ регэксп на эту же переменную: AVG> @array = $g =~ m!<pp>(.+?)</pp>!sg AVG> почему та закладка тогда не сбрасывается? Потому что закладка в строке, а не в регекспе. Именно с тем расчетом, чтобы можно было потом пустить туда другой регексп. Спецсимвол \G знаешь? >> Дальше объяснять? AVG> было бы здорово, если тока не трудно. AVG> блин, век живи - век учись. m//g в скалярном контексте работает следующим образом. Он ожидает, что следующий регексп (неважно, такой же или другой) ты захочешь начать матчить с того места, на котором остановился этот (если он не отматчился - то с того места, с которого он начинал). Потому что если ты этого не хотел, то на кой ты писал модификатор g в скалярном-то контексте? Эта схема позволяет, скажем, довольно удобно разбирать всякие языки. Применительно к твоему случаю, тебе был бы нужен модификатор g, если бы для тебя было важно, что z идет после всех p, а x - до. При этом еще надо было бы отдельно станцевать с \G, если случайно встретившийся до всех p z должен считаться ошибкой, а не просто быть тупо проигнорирован. А если тебе порядок пофигу, то модификатор ты туда прикрутил по дури, о чем тебе perl со свойственной ему лаконичностью :-) и рассказал. -- Artem Chuprina RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru Вам правду резать или кусочком? Кнышев --- ifmail v.2.15dev5.4 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/53218f7dbc2f6.html, оценка из 5, голосов 10
|