На этом шаге мы рассмотрим организацию и ипользование обратных ссылок.
Ранее мы установили, что группу элементов регулярного выражения можно заключить в скобки и рассматривать как один элемент. Заключение группы элементов в скобки имеет дополнительный и весьма полезный эффект. Если в результате поиска будет найден фрагмент текста, соответствующий образцу, заключенному в скобки, то этот фрагмент сохранится в специальной переменной. Внутри регулярного выражения к нему можно будет обратиться, используя запись \number, где number - номер конструкции () в исходном регулярном выражении. Запись \number, указывающую на найденный по образцу фрагмент текста, будем называть обратной ссылкой. Можно задать любое количество конструкций вида () и ссылаться на соответствующие найденные фрагменты текста, как на \1, \2 и т. д. Например, образцу /(.+)-\1/ со ответствуют слова "ха-ха", "хи-хи", "ку-ку" и т. п., а образцу /(.)(.).?\2\1/ - все палиндромы из четырех или пяти букв. (Палиндром - слово или предложение, которое одинаково читается слева направо и справа налево.)
Внутри образца конструкция \n (n=l, ... , 9) всегда обозначает обратную ссылку. Запись вида \nn также интерпретируется как обратная ссылка, но только в том случае, если в исходном выражении задано не менее, чем nn скобочных конструкций вида (). Иначе запись \nn обозначает символ с восьмеричным кодом nn.
Для ссылки на найденный фрагмент текста за пределами регулярного выражения, например, при задании замещающего текста в операции замены, вместо записи \number используется запись $number. Например, операция замены
$str=~s/(\S+)\s+(\S+)/$2 $1/
Область действия переменных $1, $2 и т.д, распространяется до наступления одного из следующих событий:
Аналогичным образом определяется область действия и для следующих предопределенных переменных, используемых в операциях сопоставления с образцом.
Например, в результате выполнения операции поиска
$str=~m/two/
$& - "two"; $` - "one"; $' - "three".
Следует отметить, что, если обращение к одной из переменных $&, $', $` встречается где-либо в программе, то интерпретатор Perl будет вычислять и запоминать их для каждой операции сопоставления с образцом, что, в свою очередь, замедляет выполнение всей программы. Поэтому не следует использовать данные переменные без особой необходимости.
На следующем шаге мы рассмотрим расширенный синтаксис регулярных выражений.