Программирование::Perl::Регулярные выражения - F.A.Q.
Модули: RFC::RFC822::Address, Email::Valid
Регулярное выражение: тут, тут
Как могут выглядеть адреса (если вы захотели написать свое выражение):
a%b.c@d.e# сначала письмо идет на d.e, затем на a@b.ca+b@c.d# адрес a@c.d, b - некий комментарий.a::b@c.d# mail11 (для vms) нотация.b!d# uucp нотация@a.b;c@d.e# gateway нотация
s/(aa|bb|cc|dd)/\$$1/g;# Заменяет aa -> $aa etc литеральноs/(aa|bb|cc|dd)/${$1}/g;# Заменяет aa на значение переменной $aa etc.
- Jeffrey E.F. Friedl. Mastering Regular Expressions (есть русское издание). O'Reilly&Associates, Inc. Весьма рекомендую (arto)
- regexp.ru
- perldoc perlre
- perldoc perlretut
- Есть раздел в Advanced Perl Programming (тоже O'Reilly). Весьма качественная книга для дальнейшего изучения языка (arto)
s/(["'`\\])/\\$1/sg(Kukoyasnei Ruslan)s/(?=["'`\\])/\\/sg(Дмитрий Котеров)
s/\r?\n//g;
или заменить на другой символ или последовательность символов:
s/\r?\n/<br \/>/g
в данном случае меняем на перевод строки в HTML.
1.
s[((?:ht|f)tp://(?:[\w\-]+\.)+\w+(?:\:\d+)?(?:/[\w\.\~,\-/]*(?:\?[\w;% \+\-,\=\&]+)?(?:\*)?)?)][\<a href="$1">$1\</a>]goi;
(Андрей Новиков)
2.
s/\b((ht|f)tp):(\/\/)([a-z0-9.:@*()~#\]\[_?=&\/\\-])+/<a href=$&>$&<\/a>/gi;
(Михаил Кюршин)
3.
s|(http://[^\s]+)|<a href=$1>$1</a>|ig;
(Михаил Костиков)
use locale; use POSIX qw(locale_h); setlocale(LC_CTYPE,"ru_RU.CP1251");
Правда следует отметить, что соответствущая кодировка должна пониматься самой операционной системой.
См. так же:
perldoc locale
perldoc perllocale
Поддержка Unicode
Автор ответа - Виктор Ганский
Проблема:
Если в программе или в любом подключаемом ей модуле есть хоть одно упоминание о $&, $` или $', то для каждого успешного совпадения регулярного выражения Perl будет заполнять эти переменные, что, мягко говоря, иногда очень ресурсоемко.
Вдобавок, использование переменных этого семейства подавляет некоторые оптимизации при заменах.
Вердикт:
Полностью исключить использование этих переменных и модулей их содержащих.
Альтернативы:
$& - заключить все выражение в ()
$` - (.*?) перед выражением
$' - (?=(.*)) после выражения
И использовать $1-$9.
Пример:
$str = '1'x1000000;
$str =~ /1/;
$str = 'abc'; # Эту строку можно убрать
$str =~ /a/; # Эту строку можно убрать
$';
После первого регулярного выражения для переменной $' резервируется дополнительный мегабайт в памяти. Теперь, этот мегабайт так и останется зарезервированным независимо от того, что логически, после второго регулярного выражения "длина" $' будет только 2 байта.
![[logo]](/site/images/logo.jpg)