LINUX.ORG.RU

В «Интернет-Университете Информационных Технологий» появился курс «Регулярные выражения Perl и их применение»


0

0

Сергей Мельников разработал курс "Регулярные выражения Perl и их применение", который размещён на сайте бесплатного виртуального ВУЗа.

В нём изложено подробное неформальное описание синтаксиса и механизма работы регулярных выражений языка Perl с примерами использования от простых к сложным. Может быть интересен всем разработчикам, "регулярно выражающихся" не только на Perl, но и на других языках программирования :-)

>>> Подробности



Проверено: maxcom ()

имхо, нафиг не надо, есть фридл, и к тому же лама и кемел бук

defmacro
()

Это типа для тех кто man perlre ниасилил? Фтопку.

anonymous
()

Вообще-то боян :)

anonymous
()

BTW Perl умудрился из прекрасной математической модели регулярных выражений сделать тормозную гадость :)

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Поправочка: работающую на практике тормозную гадость.

Да, к модераторам: поправьте согласование: "всем, интересующиМся".

lodin ★★★★
()
Ответ на: комментарий от lodin

На практике много гадости работает :) Но то, что сложность стала из квадратичной экспоненциальной (и вообще регулярные выражения перла - не регулярные выражения) - плохо.

Legioner ★★★★★
()
Ответ на: комментарий от swizard

Ещё раз прочитайте мой пост. Я не утверждал, что перл сверхсложный. Я утверждал, что в нём извратилась идея регулярных выражений (а за перлом, как обычно, этот изврат переняли все остальные). Как инструмент для определённых задач - перл вполне хорош.

PS гоню, в нормальной реализации сложность распознавания регулярного выражения линейна, а не квадратична. Если интересно - можно почитать http://swtch.com/~rsc/regexp/regexp1.html

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> PS гоню, в нормальной реализации сложность распознавания регулярного выражения линейна, а не квадратична.

Вообще-то, сложность распознавания перлового регекспа также линейна (если не применять code assertion и look-{ahead,behind}). А если применять - то квадратична.

И да, пример перлового регекспа, выполняющегося за экспоненциальное время - в студию.

anonymous
()
Ответ на: комментарий от Legioner

> сложность распознавания регулярного выражения линейна, а не квадратична.

Так а тебя никто не заставляет мегабайтной регуляркой матчить гигабайтный файл. Для этих целей можно несложный конечный автомат написать -- я вообще как-то писал подобие регулярок на лисповых макрах, там в результате вообще компилился нативный код, которым, к тому же, можно было поток матчить.

А обычная сфера применения перловых регулярок -- это while (<FD>) { m/regex/ } -- ничего сверхъестественного. Хотя, можно, конечно, вообще программировать на перловых регулярных выражениях, благо они могут быть многострочными и с комментариями :)

swizard
()
Ответ на: комментарий от Legioner

Товарищь путает NDA и NFA регулярные выражения. В NFA много чего от NDA сделать нельзя. Например, нельзя провернуть такое: (.{3,6})-\1

Joe_Bishop
()
Ответ на: комментарий от Joe_Bishop

> Хотя, можно, конечно, вообще программировать на перловых регулярных выражениях, благо они могут быть многострочными и с комментариями :)

вот именно
регесп - он и в африке регесп
нефиг наезжать :-)

kto_tama ★★★★★
()
Ответ на: комментарий от Joe_Bishop

Ну вот когда мне это будет нужно - тогда пусть и исползует бэктрекинг, в 90% extended regexp-ов хватает DFA

anonymous
()
Ответ на: комментарий от swizard

> Так а тебя никто не заставляет мегабайтной регуляркой матчить гигабайтный файл.

А почему нет?

> Для этих целей можно несложный конечный автомат написать

Зачем тратить своё время?

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

vsb@home:~/tmp$ cat test.pl 
#!/usr/bin/perl -w
use strict;

if (
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
=~
/a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa/
) {
  print "Yes\n";
}
else {
  print "No\n";
}

vsb@home:~/tmp$ time ./test.pl
Yes

real	2m6.720s
user	2m6.228s
sys	0m0.000s


DFA будет работать пару миллисекунд.

Legioner ★★★★★
()

про сабжевый "вуз"
http://linuxportal.ru/blog_comments.php/2535_0_6_0_C/
Для тру:
Этот самый университет находится здесь: http://www.intuit.ru Решил тут чего-то сдуру пройти курс "Администрирование почтовых серверов sendmail".

Это просто какой-то атас... Не знаю конечно что там дальше будет в этом курсе, но желание проходить его пропало после вопросов из первого блока.

"Практически всеми версиями ОС Linux поддерживается графическая оболочка:
* Window
* XHWindow
* WindowID
* X Window"
Разве иксы - это графическая оболочка?.. И графическая оболочка для чего?..

"Вместе с пользовательским агентом (MUA), отображающим сообщения электронной почты из почтового ящика пользователя, существует необходимость в следующем типе программ:
* MAU
* TMA
* MAI
* MTA"
По-моему вопрос неудачно составлен. Так ли уж необходимость? Разве пользователь не может работать только "на прием"? С другой стороны, MUA работает у пользователя, а MTA как правило на сервере - вещи явно из разных категорий на мой взгляд.

"Современными пакетами для работы с электронной почтой являются:
* Microsoft Exchange
* IBM Lotus Notes
* Novell GroupWise
* Novell Group"
?..

"Какая программа отображает сообщения на экране консоли в графическом режиме:
* mail
* mailup
* pine
* pineup"
Ответ есть в тексте "лекции" и этой программой является почему-то pine... А вот и ссылка на "скриншот" с ее "графическим" режимом: http://www.intuit.ru/department/internet/sendmail/class/free/1/01_03.jpg
Я улетаю с этого "графического" режима. Надо под него Quake переписать, а то его родная графика какая-то ненатуральная что ли...

Вот, оказывается, кто такие хакеры (цитата из "лекции"): "Хакерами называют людей, которые пытаются проникнуть в чужие системы через дыры в безопасности программного обеспечения". Такое ощущение, что курс какой-то профан рожал в муках.

Из их ЧаВо:
"В: Некоторые тесты неправильны, есть откровенно плохие! Разве можно научиться на плохих тестах?
О: Мы считаем, что можно научиться даже с плохими учебниками и плохими преподавателями. Не важно кто и как Вас оценивает, важно то, что Вы реально знаете! Обращаем Ваше внимание, что ошибки в тестах регулярно исправляются."
Все, занавес... Больше я там не обучаюсь.

Ip0 ★★★★
()
Ответ на: комментарий от Legioner

> if ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
> =~
> /a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/

Слушай, ты издеваешься, или чего? :) 

if ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' =~ /a{0,29}aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/)

swizard
()
Ответ на: комментарий от swizard

кстати, не подскажите, в Перле можно сделать как в PHP - вставлять в регулярные выражения сразу массивы.
Что-то вродe:

$s = "hello, world!";
@from = ("hello", "world");
@to = ("hi", "baby");
$s =~ s/@from/@to/g; # $s == "hi, baby!"

Deleted
()
Ответ на: комментарий от kto_tama

Я думая, что запускался на самом деле такой код:

#!/usr/bin/perl -w
use strict;

if (
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' =~
/a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaa
aaaaaaaaaaaa/
) {
  print "Yes\n";
}
else {
  print "No\n";
}

Sova777
()
Ответ на: комментарий от Sova777

Эх. У меня тоже не получилось вставить код. Слишком длинная строка в if().

Sova777
()
Ответ на: комментарий от Deleted

> Что-то вродe:
>
> $s = "hello, world!";
> @from = ("hello", "world");
> @to = ("hi", "baby");
> $s =~ s/@from/@to/g; # $s == "hi, baby!" 

Конкретно так нет :) Вот вариант чуток подлиннее:

my $s = "hello, world!";
my @from = ("hello", "world");
my @to = ("hi", "baby");

map { $s =~ s/$_->[0]/$_->[1]/g } map { [ $_, shift @to ] } @from;

swizard
()
Ответ на: комментарий от Ip0

я там как-то у них читал тест по html (от нечего делать), не знаю как сейчас, но тогда это был тест в духе "кто из нас дурак?" %)

Deleted
()
Ответ на: комментарий от Ip0

там курсы очень разные. по Unix, например мне понравился

Muromec ☆☆
()
Ответ на: комментарий от anonymousI

Это была попытка измерить время старта интерпретатора, если я правильно понял.

Legioner ★★★★★
()

>Я улетаю с этого "графического" режима. Если это не похоже на quake ,это ещё не значит,что это не графический режим.

Lat1n0S
()
Ответ на: комментарий от Lat1n0S

Вообще то на скине показана КОНСОЛЬ, где там графика?

anonymous
()
Ответ на: комментарий от Legioner

> 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' =~ /a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaa aaaaaaaaaaaa/

за пару миллисекунд ВСЕ варианты здесь перебрать не возможно. Иначе надо пропустить кучу возможных вариантов (что некоторые и делают).

Вообще пример из серии "Как не оптимизируй пузырьковую сортировку, все равно она работает медленно".

В "Программировании на Perl" почти есть сотня страниц разбору как внутри идет разбор regexp'ов, а создающие таких монстров -- ССЗБ

vadiml ★★★★★
()
Ответ на: комментарий от Lat1n0S

А у слаки инсталер, наверно, тоже графический?

Ip0 ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.