Обратные ссылки не определены после нахождения шаблона в 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 вторые скобки и тд.

Другие вопросы по тегам