Операции с регулярными выражениями
В данной главе неоднократно упоминались операции с регулярными выражениями, такие как поиск по образцу. Основными среди них являются: операция поиска т//, операция замены s/// и операция транслитерации tr///.
Операция поиска
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
Используется совместно с флагом g. Отменяет восстановление начальной позиции поиска при неудачном поиске образца.