POD2-RU

 view release on metacpan or  search on metacpan

lib/POD2/RU/perlretut.pod  view on Meta::CPAN


Еще одна интересная штука в том, что флаг C<s///r>  позволяет делать цепочки
замен:

    $x = "Cats are great.";
    print $x =~ s/Cats/Dogs/r =~ s/Dogs/Frogs/r =~ s/Frogs/Hedgehogs/r, "\n";
    # напечатает "Hedgehogs are great."

C<s///e> - модификатор выполнения, существующий специально для поиска и замены. 
C<s///e> воспринимает заменяемый текст,как код Perl, а не строку в двойных кавычках.
Значение, которое возвращает код подставляется
вместо найденной подстроки. C<s///e> полезно, если вам нужно сделать некоторые
вычисления в процессе замены текста. В этом примере рассчитывается
частота символов в строке:

    $x = "Bill the cat";
    $x =~ s/(.)/$chars{$1}++;$1/eg;  # конечный $1 заменяет символ на самого себя
    print "frequency of '$_' is $chars{$_}\n"
        foreach (sort {$chars{$b} <=> $chars{$a}} keys %chars);

Это напечатает

    frequency of ' ' is 2
    frequency of 't' is 2
    frequency of 'l' is 2
    frequency of 'B' is 1
    frequency of 'c' is 1
    frequency of 'e' is 1
    frequency of 'h' is 1
    frequency of 'i' is 1
    frequency of 'a' is 1

Как и в операторе поиска C<m//>, оператор C<s///> может использовать другие разделители,
Например, C<s!!!> и C<s{}{}> и даже C<s{}//>. Если используются одинарные кавычки
 C<s'''>, тогда регексп regexp и замена
рассматриваются как строки в одиночных кавычках и тогда не происходит
подстановки переменных. C<s///> в списочном контексте
возвращает то же самое, как и в скалярном контексте, т.е. число найденных элементов.

=head3 Функция split


Функция C<split()>  является еще одним местом, где используется регексп.
C<split /регексп/, строка, limit> разделяет C<строку> операнд в
список подстрок и возвращает этот список. Регексп должен быть таким
, чтобы находить любые разделители для желаемых подстрок.
C<limit>, если он присутствует, накладывает ограничение на раздел не более чем C<limit>
 строк. Например чтобы разделить строку на слова, используйте

    $x = "Calvin and Hobbes";
    @words = split /\s+/, $x;  # $word[0] = 'Calvin'
                               # $word[1] = 'and'
                               # $word[2] = 'Hobbes'

Если используется пустой регексп C<//>, то он всегда будет находиться и разделит строку 
на отдельные символы. Если регексп имеет группировки,
то результирующий список содержит совпавшие подстроки из
группировок. К примеру

    $x = "/usr/bin/perl";
    @dirs = split m!/!, $x;  # $dirs[0] = ''
                             # $dirs[1] = 'usr'
                             # $dirs[2] = 'bin'
                             # $dirs[3] = 'perl'
    @parts = split m!(/)!, $x;  # $parts[0] = ''
                                # $parts[1] = '/'
                                # $parts[2] = 'usr'
                                # $parts[3] = '/'
                                # $parts[4] = 'bin'
                                # $parts[5] = '/'
                                # $parts[6] = 'perl'
                                
Так как первый символ $x регексп находит, C<split> присоединяет
пустой начальный элемент к списку.

Если вы дочитали так далеко, Поздравляем! Теперь у вас есть все основные
инструменты, необходимые для использования регулярных выражений для решения 
широкого круга проблем обработки текста.
Если это ваш первый раз через учебник,
то почему бы не остановится и поиграть с регулярными выражениями какое-то время... 
 S<Часть 2> касается более эзотерических аспектов регулярных выражений и тех
концепций, которые, безусловно, не нужны в самом начале

=head1 Часть 2: Электроинструменты (Power Tools)

Отлично, вы знаете основы регулярных выражений и хотите узнать больше. Если
поиск регулярными выражениями является аналогом прогулки в лесу, тогда
инструменты, о которых говорилось в первой части, аналогичны топографическим картам и
компасу, это основные инструменты, которые мы используем все время. Большинство инструментов в части 2
аналогичны огненным пистолетам и спутниковым телефонам. Они не используются
слишком часто в походе, но когда мы застряли, они могут быть бесценными.

Ниже приводятся более продвинутые,но меньше использующиеся и даже иногда эзотерические
возможности регулярных выражений Perl. В части 2 мы предполагаем, что вы
комфортно себя чувствуете с основами и решили сосредоточить внимание на продвинутых функцииях.

=head2 Подробнее о символах, строк и о символьных классах

Существует ряд эскейп последовательностей и символьных классов, которые мы
пока еще не охватили.

Есть несколько escape-последовательностей, которые преобразуют символы или строки
в верхний и нижний регистр и они также доступны внутри шаблонов. 
C<\l> и C<\u> преобразуют следующий символ в нижний или
верхний регистр, соответственно:

    $x = "perl";
    $string =~ /\u$x/;  # найдет 'Perl' в $string
    $x = "M(rs?|s)\\."; # внимание двойной бекслеш
    $string =~ /\l$x/;  # найдет 'mr.', 'mrs.', и 'ms.',

C<\L> или C<\U> указывают на преобразование регистра, пока не встретится
завершающее C<\E> или бросаются другие C<\U> или C<\L>:

    $x = "This word is in lower case:\L SHOUT\E";
    $x =~ /shout/;       # найдет
    $x = "I STILL KEYPUNCH CARDS FOR MY 360"
    $x =~ /\Ukeypunch/;  # найдет punch card string

Если нет C<\E>, регистр меняется до конца строки. 
Регексп C<\L\u$word> или C<\u\L$word> конвертирует первый символ
у C<$word> в верхний регистр и оставшиеся символы в нижний регистр.

Управляющие символы могут быть заэскейплены при помощи
C<\c>, то есть символ control-Z будет найден с помощью C<\cZ>.  



( run in 0.718 second using v1.01-cache-2.11-cpan-71847e10f99 )