Операция поиска
Операция поиска
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) .
Рассмотрим следующий скрипт.
$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