Шаг 103.
Операции с регулярными выражениями. Операция поиска

    На этом шаге мы рассмотрим операцию поиска и ее использование.

    В предыдущих шагах неоднократно упоминались операции с регулярными выражениями, такие как поиск по образцу. Основными среди них являются:

Операция поиска

    m/PATTERN/cgimosx

    Операция поиска m/PATTERN/ осуществляет поиск образца PATTERN. Результатом операции является значение 1 (ИСТИНА) или пустая строка (ЛОЖЬ). По умолчанию поиск осуществляется в строке, содержащейся в специальной переменной $_. Можно назначить другую строку для поиска в ней заданного образца при помощи операций связывания =~ или !~:

    $var =~ m/PATTERN/cgimosx

    В результате последней операции поиск образца PATTERN будет осуществляться в строке, задаваемой переменной $var. Если в правой части операции связывания стоит операция поиска m//, то в левой части может находиться не обязательно переменная, а любое строковое выражение.

    Операция !~ отличается от операции =~ тем, что возвращает противоположное логическое значение. Например, в результате поиска в строке "аааbbbccc" образца /b+/:

    $s="aaabbbccc" =~ m/b+/;
    $s="aaabbbccc" !~ m/b+/;

в обоих случаях будет найден фрагмент bbb. Но в первом случае возвращаемое значение, сохраненное в переменной $s, будет равно 1 (ИСТИНА), а во втором случае - пустой строке (ЛОЖЬ).

    Образец PATTERN может содержать переменные, значения которых подставляются при каждом выполнении поиска по данному образцу.

    Флаги cgimosx модифицируют выполнение операции поиска. Флаги imsx имеют тот же смысл, что и в рассмотренном на 101 шаге случае конструкции расширенного регулярного выражения (?imsx-imsx):

Остальные флаги выполняют следующие функции.

    В качестве символов-ограничителей для выделения образца можно использовать любую пару символов, не являющихся цифрой, буквой или пробельным символом. Если в качестве ограничителя используется символ "/", то литеру m в обозначении операции можно опустить и использовать упрощенную форму /PATTERN/ вместо m/PATTERN/.

    Если в качестве ограничителя используется одинарная кавычка ', то подстановка значений переменных внутри образца не производится.

    Если в качестве ограничителя используется символ "?": ?PATTERN?, то при применении операции поиска находится только одно соответствие. Например, в результате выполнения скрипта

#! perl -w
$str="abaabbaaabbbaaaabbbb";
while ($result = $str =~ m?a+b+?g) 
{
   print "result=$result, current match is $&, position=", pos($str),"\n";
}
Текст этого примера можно взять здесь.

будет найдено только первое соответствие образцу:


Рис.5. Пример работы скрипта

    На следующем шаге мы рассмотрим операцию замены.




Предыдущий шаг Содержание Следующий шаг