Жизненный цикл переменных частичных совпадений

Переменные частичных совпадений обычно продолжают существовать до следующего успешного совпадения. Другими словами, неудачный поиск сохраняет предыдущие значения переменных, а при успешном поиске они сбрасываются. Это подразумевает, что переменные частичных совпадений не могут использоваться без успешного поиска совпадения; в противном случае в них будет храниться информация, относящаяся к предыдущему шаблону. Следующий (неудачный) пример вроде бы должен выводить совпавшее слово из строки $wilma. Но если поиск завершится неудачей, переменная сохранит свое предыдущее значение:

$wilma =~ /(\w+)/; # BAD! Untested match result
print "Wilma's word was $1... or was it?\n";

Это еще одна причина, по которой поиск по шаблону почти всегда размещается в условии if или while:

if ($wilma =~ /(\w+)/) {
print "Wilma's word was $1.\n";
} else {
print "Wilma doesn't have a word.\n";
}

Так как переменные частичных совпадений не сохраняют свое значение навсегда, их не рекомендуется использовать далее чем в нескольких строках от команды поиска. Если во время сопровождения вашей программы между регулярным выражением и использованием $1 будет случайно вставлено новое регулярное выражение, то вы получите значение $1 для второго совпадения вместо первого. Если же текст частичного совпадения может понадобиться далее чем в нескольких строках от команды поиска, чаще всего он копируется в обычную переменную. Одновременно такое копирование сделает программу более понятной:

if ($wilma =~ /(\w+)/) {
my $wilma_word = $1;
...
}

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

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