Создание серверных приложений на языке PERL


Regular expressions (регулярные выражения)





Q: А что это за закорючки такие в скрипте - s/^[^\w]{1,3}(\d+)/$1/


A: Это регулярные выражения, одна из мощнейших возможностей perl. Средства

поиска и замены подстрок в строках



Q: Как ими пользоваться?


A: Этому учатся всю жизнь. Даже книга есть - "Mastering regular

expressions". Также следует прочесть perldoc perlre

А начать можно со следующего: // - поиск

s/// - поиск и замена

tr/// - трансляция

Если мы хотим узнать, нет ли в строке $_ подстроки 'my', мы пишем:

/my/;

Если мы имеем дело не с переменной по умолчанию, а с любой другой, пишем:

$str=~/my/;

Если мы хотим заменить в строке подстроку tree на root, используем поиск и

замену:

$str=~s/tree/root/; В конце выражения могут стоять опции g, i и т.п. g означает проводить замену

не 1 раз, а по всей подстроке. i означает не учитывать регистр символов. В подстроке для поиска можно использовать управляющиесимволы. Есть

несколько видов управляющих символов- мета-символы, обозначающие какой-то

символиз набора букв, цифр,и т.п., мета-символы, управляющие количеством

символов, и т.п. Hапример, \d в подстроке обозначает любую цифру, \w -

любую букву, \s - пробел, . - любой символ. Стоящая после мета-символа *

означает, что предыдущий символ может повторяться 0 или более раз. + означает

повторение 1 или более раз. То есть, строка вида $str=~s/\s\d+\s/ 1 /g; означает "заменить все числа в строке $str, отделенные пробелами с двух

сторон, на цифру 1, отделенную пробелами". Более подробное описание регулярных выражений, список управляющих символов и

других возможностей смотрите в документации.



Q: Как не учитывать регистр в русском тексте? С английским регекспы с ключом

i работают, а с русским - нет.


A: Hа UNIX'оподобных системах с корректной локализацией (FreeBSD, Linux на

glibc 2.1) это делается так:


use locale;

use POSIX qw (locale_h);

setlocale(LC_CTYPE, 'ru_RU.KOI8-R'); (можно еще выставить переменную окружения export LANG=ru_RU.KOI8-R

тогда будет достаточно вызова use locale; в Perl-скрипте)




Начало  Назад  Вперед