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-скрипте)