Регулярные выражения Perl и их применение

       

Специальные переменные, изменяемые при поиске


При совпадении в операторах m/…/ и s/…/…/ изменяют значения специальные переменные регулярных выражений. Напомню их.

  • $` - текст перед совпадением всего регулярного выражения.
  • $& - текст, с которым совпало все регулярное выражение.
  • $' - текст после совпадения всего регулярного выражения.
  • $1 - текст, совпавший с первой парой захватывающих скобок.
  • $2 - текст, совпавший со второй парой захватывающих скобок.
  • $99 - текст, совпавший с 99-й парой захватывающих скобок.
  • $+ - Содержимое нумерованной переменной ($1, $2, … ,$99) с максимальным номером (на момент использования переменной $+).
  • $^N - Содержимое нумерованной переменной ($1, $2, … ,$99), соответствующей последней только что закрытой паре скобок (на момент использования переменной $^N). (Эту переменную в отличие от $+ почему-то можно читать сразу после закрывающей захватывающей скобки. Возможно, эта ошибка уже исправлена в новой версии Perl.)
  • @- - массив начальных индексов совпадений в целевом тексте. $-[0] соответствует переменной $&, $-[1] - переменной $1, …, $-[99] - переменной $99.
  • @+- массив конечных индексов (т.е. индексов первого символа после совпадения) совпадений в целевом тексте. $+[0] соответствует переменной $&, $+[1] - переменной $1, …, $+[99] - переменной $99.
  • $^R - стоит немного особняком и допускает присваивание. Результат последней по времени исполняемой части встроенного кода, который расположен не в условии условной конструкции (? if then [ | else ] ).

Все эти переменные кроме $^R предназначены только для чтения. Многие авторы по ошибке считают, что переменная $^R тоже только читается, но мы убедились в противоположном. Также они ошибаются, говоря, что вне регулярного выражения эта переменная не имеет смысла.

Все эти переменные изменяют свое значение только при успешном поиске, при неудачном они хранят последнее присвоенное значение.

Переменные $1, $2, …, $99 устанавливаются сразу после закрытия соответствующей скобки, поэтому их можно использовать во встроенном коде или динамических регулярных выражениях внутри регулярного выражения. (Вне встроенного кода и динамических регулярных выражений используйте обратные ссылки \1, \2, …, \99.) То же относится к переменным $+, $^N, @- и @+. Переменная $^R получает значение после завершения соответствующего встроенного кода Perl.

В случае применения модификатора g (gc) при каждой итерации значения этим переменным присваиваются заново. Поэтому в операторе подстановки эти переменные всегда соответствуют соответствующим фрагментам текста из последней итерации.



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