Иллюстрированный самоучитель по Perl

       

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


m/PATTERN/cgimosx

Операция поиска HI/PATTERN/ осуществляет поиск образца PATTERN. Результатом операции является значение 1 (ИСТИНА) или пустая строка"

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

$var =~ m/PATTERN/cgimosx

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

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

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

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

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

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

  • i — поиск без учета регистра;
  • m — трактуется как мульти-строка, состоящая из нескольких строк, разделенных символом новой;
  • s — строка трактуется как одна строка, в этом случае метасимволу "." со-, ответствует любой одиночный символ, включая символ новой строки;


  • х — разрешается использовать в образцах пробелы и комментарии.
  • стальные флаги выполняют следующие функции.
  • g — Задает глобальный поиск образца в заданной строке. Это означает, что будут найдены все фрагменты текста, удовлетворяющие образцу, а не только первый из них, как имеет место по умолчанию. Возвращаемое значение зависит от контекста. Если в составе образца имеются подоб-разцы, заключенные в скобки (), то в контексте массива для каждого заключенного в скобки подобразца возвращается список всех найденных фрагментов. Если в составе образца нет подобразцов, заключенных в скобки, то в контексте массива возвращается список всех найденных фрагментов, удовлетворяющих образцу. В скалярном контексте каждая операция m//g осуществляет поиск следующего фрагмента, удовлетворяющего образцу, возвращая значение 1 (ИСТИНА), если он найден, и пустую строку ", если не найден. Позиция строки, в которой завершился последний поиск образца при установленном флаге g, может быть получена при помощи встроенной функции роз о (см. ниже). Обычно при неудачном поиске начальная позиция поиска восстанавливается в начало строки. Флаг с отменяет восстановление начальной позиции поиска при неудачном поиске образца.



  • Рассмотрим следующий скрипт.

    $str="abaabbaaabbbaaaabbbb";

    tt контекст массива, нет подобразцов в скобках

    @result=$str =~m/a+b+/g;

    print "контекст массива, нет конструкций в скобках:\n";

    print "\@result=@result\n";

    # контекст массива, есть конструкции в скобках, задающие обратные ссылки

    @result=$Str =~m/(a+)(b+)/g;

    print "контекст массива, есть конструкции в скобках:\n";

    print "\@result=@result\n";

    # скалярный контекст

    print "скалярный контекст:\n";

    while ($result=$str =~m/(a+)(b+)/g) {

    print "result=$result, current match is $&, position=",pos($str),"\n"; }

    Результатом его выполнения будет вывод:

    контекст массива, нет конструкций в скобках:

    @result=ab aabb aaabbb aaaabbbb

    контекст массива, есть конструкции в скобках:

    @result=a b aa bb ааа bbb aaaa bbbb

    скалярный контекст:

    result=l, current match is ab, position=2

    result=l, current match is aabb, position=6

    result=l, current match is 'aaabbb, position=12

    result=l, current match is aaaabbbb, position=20

    HI с — Используется совместно с флагом g. Отменяет восстановление начальной позиции поиска при неудачном поиске образца.

    Рассмотрим скрипт

    $str="abaabbaaabbbaaaabbbb";

    while ($result=$str =~m/(a+)(b+)/g) {

    print "result=$result, current match is $&, position=",pos($str),"\n";

    } • print "last position=", pos($str), "\n";

    Здесь поиск образца /а+ь+/ в строке $str осуществляется в цикле до первой неудачи. При последнем (неудачном) поиске начальная позиция поиска по умолчанию устанавливается в начало строки, в этом случае вывод имеет вид:

    result=l, current match is ab, position=2 result=l, current match is aabb, position=6 result=l, current match is aaabbb, position=12 result=l, current match is aaaabbbb, position=20 last position=

    Если глобальный поиск осуществлять при установленном флаге с:

    while ($result=$str =~m/ (a+) (b+)/gc) {

    то при последнем неудачном поиске начальная позиция поиска не переустанавливается. Вывод имеет вид:



    result=l, current match is ab r position=2 result=l, current match is aabb, position=6 result=l, current match is aaabbb, position=12 result=l, current match is aaaabbbb, position=20 last position=20

    При задании образца для глобального поиска m//g можно использовать ме-тапоследовательность \с, представляющую точку, в которой закончился последний поиск m//g. Например, в результате выполнения скрипта .

    ^^х

    $str="l) abc 2) aabbcc 3) aaabbbccc 4) aaaabbbbcccc";

    $str=~m/3\)\s+/g; \

    ! $str=~m/\Ga+/; ,'

    сначала по образцу будет найден фрагмент "3)", а затем фрагмент, удовлетворяющий образцу /а+/ и расположенный сразу за точкой, в которой завершился последний поиск. Этим фрагментом является "ааа".

    По— Значения переменных, входящих в состав образца PATTERN, подставляются только один раз, а не при каждом поиске по данному образцу. Рассмотрим, например, следующий скрипт:

    @pattnlist=("a+", "Ы-", "с+", "d+") ; foreach $pattn (@pattnlist) (

    $line = <STDIN>; $line =~ m/$pattn/o;

    print "pattn=$pattn \$&= $&\n"; }

    Массив gpattniist содержит список образцов "a+", "b+", "с+" и "d+". В цикле по элементам этого списка в переменную $iine считывается очередная строка из стандартного ввода. В ней осуществляется поиск по образцу, совпадающему с текущим элементом списка. Поскольку использован флаг о, подстановка значений в образце /$pattn/ будет осуществлена один раз за время жизни данной Peri-программы, т. е. в качестве образца на каждом шаге цикла будет использовано выражение "а+". Если операцию поиска осуществлять без флага о:

    $line =~ m/$pattn/,

    то в качестве образца будут последовательно использованы все элементы списка "а+", н b+", "с+" и "d+".

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

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

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

    $str="abaabbaaabbbaaaabbbb";

    while ($result = $str =~ m?a+b+?g) (

    print "result=$result, current match is $&, position=", pos($str),"\n";

    }

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

    result=l, current match is ab, position=2




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