Операции с регулярными выражениями
Рассмотрим скрипт:
$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