Шаг 106.
Операция заключения в кавычки qr//

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

    qr/STRING/imosx

    Операция qr// по своему синтаксису похожа на другие операции заключения в кавычки, такие как q//, qq//, qx//, qw//. Она обсуждается здесь, так как имеет непосредственное отношение к регулярным выражениям. Регулярное выражение, содержащее переменные, метасимволы, метапоследовательности, расширенный синтаксис, перед использованием должно быть обработано компилятором. Операция qr// осуществляет предварительную компиляцию регулярного выражения STRING, преобразуя его в некоторое внутреннее представление, с тем, чтобы сохранить скомпилированное регулярное выражение в переменной, которую затем можно использовать без повторной компиляции самостоятельно или в составе других регулярных выражений.

    Преимущества от применения операции qr// проявляются, например, в следующей ситуации. Допустим, что мы собираемся многократно использовать в качестве образца достаточно сложное регулярное выражение, например, /^ ([^ ] *) *([^ ]*)/. Его можно использовать непосредственно в операции сопоставления с образцом

    if ($line  =~ /^ ([^ ] *)  *([^ ]*)/)  {...},
или сохранить в переменной $pattern="/^ ([^ ] *) *([^ ]*)/" и обращаться к переменной:
    if ($line =~/$pattern/)    {...}

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

    $pattn = qr/^ ([^ ] *)  *([^ ]*)/,
то переменная $pattn будет содержать откомпилированное регулярное выражение, которое можно неоднократно использовать без дополнительной компиляции.

    Флаги imosx имеют тот же смысл, что и в операции замены m//. Например, в следующем тексте операция qr// применяется с флагом x:

#! perl -w
$s="aA1Bb2cC3Dd45Ee";
@pattns=("\\d+  # последовательность цифр",
"[A-Z] + # последовательность прописных букв",
"[a-z]+ # последовательность строчных букв"); 
foreach $pattn (@pattns)   
{ 
  $pattern=qr/$pattn/x; 
  while ($s=~/$pattern/g)    
  { 
    $p=$p.$&;
  }
}
print  "s=$s p=$p\n";
Текст этого примера можно взять здесь.

    В данном примере определен массив @pattns, состоящий из регулярных выражений. В цикле по элементам массива проверяется наличие в заданной строке $s фрагмента, соответствующего текущему образцу. Найденный фрагмент добавляется в конец строки . Флаг х в операции qr// позволяет использовать образцы в том виде, в каком они хранятся в массиве - с пробелами и комментариями. В результате выполнения скрипта строка будет состоять из символов строки $s, расположенных в следующем порядке: сначала все цифры, затем все прописные буквы, затем все строчные буквы.


Рис.1. Результат работы скрипта

    Если установить флаг о, то результат не изменится, так как переменная $pattn постоянно меняется, поэтому флаг o не работает.

    На следующем шаге мы рассмотрим функции для работы со строками.




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