Обратные ссылки не определены после нахождения шаблона в perl v5.14.2
Мне показалось странным, что обратные ссылки ($1,$2,$3) не работали в моем исходном коде, поэтому я запустил этот пример из Интернета:
#!/usr/bin/perl
# matchtest2.plx
use warnings;
use strict;
$_ = '1: A silly sentence (495,a) *BUT* one which will be useful. silly (3)';
my $pattern = "silly";
if (/$pattern/) {
print "The text matches the pattern '$pattern'.\n";
print "\$1 is '$1'\n" if defined $1;
print "\$2 is '$2'\n" if defined $2;
print "\$3 is '$3'\n" if defined $3;
print "\$4 is '$4'\n" if defined $4;
print "\$5 is '$5'\n" if defined $5;
}
else {
print "'$pattern' was not found.\n";
}
Который только дал мне:
The text matches the pattern 'silly'.
Почему обратные ссылки все еще не определены после того, как шаблон был найден? Я использую Wubi (Ubuntu 12.04 64-bit) и моя версия perl 5.14.2. Спасибо заранее за вашу помощь.
2 ответа
Это ожидаемое поведение! Очевидно, что ваш шаблон будет соответствовать, поэтому не удивительно, что соответствующий if
Блок выполнен.
Термин "обратные ссылки" для $1, $2, ...
может быть немного неоптимальным, давайте назовем их "группы захвата".
В регулярном выражении вы можете заключить части шаблона в паренсы, чтобы запомнить их позже:
/(silly)/
Эта модель имеет одну группу. Содержимое этой группы будет храниться в $1
если это соответствует.
Все переменные группы захвата для групп, которые не существуют в шаблоне или не были заполнены, устанавливаются в undef
в противном случае удачное совпадение, так что для приведенного выше шаблона $2, $3, ...
все будет undef
,
Вы не захватываете никаких строк: в вашем шаблоне нет скобок. Если вы сделали:
my $pattern = "(silly)";
Вы бы получили что-то в $1
,
Если вы не знаете, $1
это текст в первых скобках, $2
вторые скобки и тд.