Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Serg31416

Страницы: [1]
1
Привет.

 Использую Perl 5.10.2, получаю:

\'a\' =~ /^(?(?=b)b)a$/       # not match...

Очень интересно, такое впечатление, что yes-subpattern пробуется на соответствие, хотя условие (?=b) должно возвращать false.

2
print "Match: \\$1=$1" if \'abcde\' =~ /^((\\w\\w+)(?{print defined $2 ? "-$2-\\n" : "--\\n"})){2}$/;

Выводит:

-abcde-
--
--
-de-
Match: $1=de

Объясните, почему 2 раза $2 оказался undefined, ведь после выхода за 2-ю захватывающую скобку в $2 должно быть минимум 2 символа.

Сергей

3
Привет.

 Можно ли регулярным выражением Perl проверить синтаксис арифметического выражения типа -(+1+2)*(3/(1-2))/((-3))? Народ в этом сомневается и использует для этого модуль Perl. Я сегодня подумал раза 2 и получил легко и красиво такое выражение. Потом написал об этом статейку Perl регулярные выражения: проверка правильности арифметического выражения
 Возможно, что до меня ещё никто не получал такого регулярного выражения Perl. Думаю, что посетителям этой ветки форума это будет интересно.

4
Привет.

Вчера неожиданно обнаружил ошибку в ActiveState Perl 5.10 в регулярных выражениях. Написал об этом тут:
http://forums.webscript.ru/showthread.php?s=&threadid=27405

5
Perl / Ошибка в ActiveState Perl 5.10.0
« : 16 Октября 2010, 11:19:57 »
Привет.

 Вчера в ActiveState Perl 5.10.0 build 1003 для Win 32 нашёл ошибку в регулярных выражениях: конструкции (?=) и (?<=) вообще не работают! Нигде не находится пустой фрагмент текста при заглядывании впёрёд и назад! Напр., оператор
\'aaa\' =~ /a(?=)aa/;
не находит соответствия!
Только что скачал ActiveState Perl 5.12, проверил и увидел, что эта ошибка исправлена. Ведь при заглядывании вперёд и назад пустой фрагмент должен находиться везде, даже перед \\A и после \\z в пустой строке.
Интересно, как с этой ошибкой обстоит дело в других платформах? Откуда эта ошибка могла взяться, ведь в предыдущих версиях её не было. ActiveState по идее просто портирует этот модуль работы с регекспами под Виндовс. Неужели, эта ошибка возникла в ядре Перла?

6
Привет.

 Я начал публиковать продвинутые статьи по регулярным выражениям Perl  по главам своей книги "Perl для профессиональных программистов. Регулярные выражения".
 Также буду публиковать полезные программки на Perl, интересные статьи для веб-мастеров и отвечать на вопросы по Perl re. Заходите, кому интересно.

7
Perl / Ещё одна ошибка в Perl re
« : 07 Июля 2008, 10:17:48 »
Нашёл ещё одну ошибку в Perl re:

print "Match" if \'ab\' =~ /^a?(?=b)b/;

не находит, а должен бы. ^ можно заменить на \\A, а ? можно заменить на * с тем же результатом.
Это я уже засабмитил на http://bugs.activestate.com/show_bug.cgi?id=78536
 Вот ещё сходные ошибки:

print $& if \'ab\' =~ /a?(?=b)b/;
print $& if \'ab\' =~ /a*(?=b)b/;

печатают b, а должны печатать ab.
 Похоже, что эта ошибка есть во всех версиях и платформах. По крайней мере, в
ActiveState Perl 5.10.0 под Win32 и в 5.8.8 под Debian она есть.
 Мой e-mail cron+c [] cronc.com

8
Привет.

 Один программист поставил такую задачку, которая встречается при обработке ini-файлов в связи с изменением версии программы.
Написать оператор подстановки s///, который в тексте во всех строках, где не встречается aaa, заменит все подстроки bbb на ccc. В общем случае эти образцы подстрок находятся в переменных $a, $b и $c.

Например, имеем фрагмент программы:

$_=<bbb aaa bbb
bbb aa bbb bbb
aaa bbb bbb
aa bbb bbb
EOD

s/.../.../;
print $_;

 При выводе должно получиться

bbb aaa bbb
ccc aa ccc ccc
aaa bbb bbb
aa ccc ccc

 Аналогично, написать оператор s///, который заменит все bbb на ccc во всех строках, в которых встречается aaa.

9
Регулярные выражения / Книжка по gegexp
« : 28 Февраля 2008, 09:20:03 »
Привет всем.

 Для тех, кто интересуется рег. выражениями: вышла моя книжка "Профессиональная работа в Perl. Регулярные выражения".
Я в ней глубоко и подробно разбираю этот вопрос. Юникод не рассматриваю. Вот один мой пример из этой книги:

# Заменить во всем тексте все символы табуляции соответствующим числом пробелов.

$_=<a\\tПервая строка\\t.
Вторая строка.
\\t\\tТретья строка.
Четвертая строка.
EOF

my ($offs,$tmp);

s/(?:^(?{ $offs=0 }))?
  ([^\\t\\n]*)
  \\t
 /$tmp=$offs+length $1;
  $offs+=$tmp+(8-$tmp % 8);
  $1.\' \' x (8-$tmp % 8)/egmx;

print $_;
 
 
 На books.ru эта книжка стоит 225 р., я могу продать из своих авторских экз. за 200 р. вместе с пересылкой
(WMR, Яндекс-деньги, сберкасса). Пишите на wait4sleep [] rambler . ru

10
Привет.

  Кто-нибудь может объяснить, как работают операторы \\L \\l \\U \\u и им подобные? Я ни в книжках, ни в файлах к activeperl этого не нашел. У этих операторов есть какая-нибудь ассоциативность и приоритет?
 Берем пример:

print "\\L\\udD";

 \\L говорит, что все буквы до конца строки будут маленькими, \\u говорит: фиг тебе, d сразу после меня все равно будет большой. Есть ли какое-то правило, чтобы это определять?
 В результате получается Dd.
 Берем другой пример:

print "\\LdD\\udD";

 \\L и \\u говорят то же самое, в результате получаем dddd... Маразм? Да!
 По идее, у подобных операторов должна быть правая ассоциативность, но на самом деле вообще непонятно, как они работают.
 И почему последовательность "...\\L\\U..." и обратная ей считаются ошибкой синтаксиса? Почему \\l\\u не считаются?

Страницы: [1]