Кажется, это ошибка Eclipse, хотя перезапуск Eclipse отлично подойдет для меня, надеюсь, что это тоже поможет кому-то еще.
Переменные $ number
содержат части строки, соответствующие группам захвата (...)
в шаблоне для вашего последнее совпадение регулярного выражения, если совпадение было успешным.
Например, возьмите следующую строку:
$text = "the quick brown fox jumps over the lazy dog.";
После оператора
$text =~ m/ (b.+?) /;
$ 1
соответствует тексту « коричневый
».
$ 1, $ 2 и т. д. будут содержать значение захвата из последнего успешного match - важно проверить, было ли совпадение успешным, прежде чем обращаться к ним, то есть
if ( $var =~ m/( )/ ) { # use $1 etc... }
Пример проблемы - $ 1 содержит «Quick» в обоих операторах печати ниже:
#!/usr/bin/perl
'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";
'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";
В общем, на вопросы, касающиеся "магических" переменных в Perl, можно ответить, просмотрев документацию по предопределенным переменным Perl а-ля:
perldoc perlvar
Однако, если вы выполните поиск здесь документацию для $ 1 и т. д., вы найдете ссылки в ряде мест, кроме раздела, посвященного этим "цифровым" переменным. Вы должны искать
$<digits>
. Я бы добавил это к ответу Брайана , комментируя или редактируя, но у меня недостаточно репутации. Если кто-то добавит это, я удалю этот ответ.
Как указывали другие, $ x - это переменные захвата для регулярных выражений, позволяющие вам ссылаться на разделы согласованного шаблона.
Perl также поддерживает именованные захваты, которые могут быть проще для людей. чтобы помнить в некоторых случаях.
Дан ввод: 111 222
/(\d+)\s+(\d+)/
$ 1 равен 111
$ 2 равен 222
Можно также сказать:
/(?<myvara>\d+)\s+(?<myvarb>\d+)/
$ + {myvara} равно 111
$ + { myvarb} - это 222
Переменные $ 1 .. $ 9 также являются переменными только для чтения, поэтому вы не можете неявно присвоить им значение:
$ 1 = 'foo'; print $ 1;
Это вернет ошибку: Попытка изменить значение только для чтения в строке сценария 1.
Вы также не можете использовать числа в начале имен переменных:
$ 1foo = 'foo '; print $ 1foo;
Вышеупомянутое также вернет ошибку.
Я подозреваю, что в 32-битном скомпилированном двоичном файле Perl может быть до 2 ** 32 -1
пронумерованных переменных соответствия.
Они называются «переменными соответствия». Как упоминалось ранее, они содержат текст из вашего последнего совпадения регулярного выражения.
Дополнительная информация находится в Essential Perl . ( Ctrl + F для «Сопоставить переменные», чтобы найти соответствующий раздел.)
Числовые переменные - это совпадения из последнего успешного оператора сопоставления или подстановки, который вы применили:
my $string = 'abcdefghi';
if ($string =~ /(abc)def(ghi)/) {
print "I found $1 and $2\n";
}
Всегда проверяйте успешность сопоставления или подстановки перед использованием 1 доллар
и так далее. В противном случае вы можете забрать остатки от другой операции.
Регулярные выражения Perl описаны в perlre .