Автоматические переменные совпадения

Существуют еще три переменные поиска совпадений, которые «бесплатно» предоставляются в ваше распоряжение независимо от того, содержит шаблон сохраняющие круглые скобки или нет. К сожалению, эти переменные имеют довольно странные имена. Возможно, Ларри с радостью присвоил бы им какие-нибудь более привычные имена, скажем $gazoo или $ozmodiar. Но кто знает, не захочется ли какому-нибудь программисту использовать их в своем коде? Чтобы рядовому программисту Perl не приходилось запоминать имена всех специальных переменных Perl перед выбором имени первой переменной в первой программе1, Ларри присвоил многим встроенным переменным Perl странные имена, которые «нарушают правила». В данном случае имена состоят из знаков препинания: $&, $` и $'. Странно, уродливо, непривычно, но это их имена. Часть строки, фактически совпавшая с шаблоном, автоматически сохраняется в $&:

if ("Hello there, neighbor" =~ /\s(\w+),/) {
print "That actually matched '$&'.\n";
}

Программа сообщает, что шаблон совпал с текстом " there," (пробел, слово и запятая). Переменная $1 содержит только слово, а в переменной $& хранится все совпадение. Часть исходной строки, предшествующая совпавшей части, хранится в переменной $`, а часть, которая идет после нее, в $'.


Сформулировать можно и иначе: $` содержит текст, пропущенный ядром регулярных выражений перед обнаруженным совпадением, а $' – остаток строки, до которого шаблон так и не добрался. «Склеив» эти три строки, вы всегда получите исходную строку:

if ("Hello there, neighbor" =~ /\s(\w+),/) {
print "That was ($`)($&)($').\n";
}

Формат строки в сообщении, (Hello)( there,)( neighbor), демонстрирует все три автоматические переменные поиска в действии. Конечно, каждая из этих трех переменных может быть пустой (по аналогии с нумерованными переменными поиска). Все они обладают такой же областью видимости, что и нумерованные переменные. В общем случае это означает, что они сохраняют свои значения до следующего успешного совпадения. Ранее мы назвали эти три переменные «бесплатными». Что ж, «бесплатное» тоже имеет свою цену. В данном случае цена такова: если хотя бы одна из автоматических переменных используется где-либо в программе, другие регулярные выражения будут работать чуть медленнее.

Замедление не катастрофическое, но даже его оказывается достаточно для того, чтобы многие программисты Perl никогда не пользовались автоматическими переменными. Вместо этого они отыскивают всевозможные обходные решения. Например, если вас интересует только значение $&, заключите весь шаблон в круглые скобки и используйте $1 (конечно, это может потребовать перенумерации переменных). Переменные поиска (как автоматические, так и нумерованные) чаще всего используются в операциях замены.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Границы слов
Добавление пропусков (/x)
Другие модификаторы
Жизненный цикл переменных частичных совпадений
Именованное сохранение