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

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


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


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


  • Как не учитывать регистр в русском тексте? С английским регекспы с ключом i работают, а с русским - нет.


  • Кто-нибудь может мне по-русски рассказать о операторах: ?:, ?!, ?= и т.д. и когда они используются?



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



    Содержание раздела