Что означает $1 в Perl? Кроме того, что означает $2? Сколько здесь числовых переменных?
Переменные $number
содержат части строки, которые соответствуют группам захвата ( ... )
в шаблоне для вашего последнего соответствия регулярному выражению если матч прошел успешно.
Например, возьмите следующую строку:
$text = "the quick brown fox jumps over the lazy dog.";
После утверждения
$text =~ m/ (b.+?) /;
$1
равен тексту "brown
".
Числовые переменные - это совпадения от последнего успешного совпадающего или замещающего оператора:
my $string = 'abcdefghi';
if( $string =~ /(abc)def(ghi)/ ) {
print "I found $1 and $2\n";
}
Всегда проверяйте, что совпадение или замена были успешными, прежде чем использовать $1 и так далее. В противном случае вы можете получить остатки от другой операции.
Регулярные выражения Perl документируются в perlre.
$1, $2 и т.д. будут содержать значение захватов из последнего успешного совпадения - важно проверить, удалось ли совпадение перед доступом к ним, т.е.
if ( $var =~ m/( )/ ) { # use $1 etc... }
Пример проблемы - $1 содержит "Быстрый" в обоих заявках ниже:
#!/usr/bin/perl
'Quick brown fox' =~ m{ ( quick ) }ix;
print "Found: $1\n";
'Lazy dog' =~ m{ ( quick ) }ix;
print "Found: $1\n";
Как указывали другие, $x - это переменные захвата для регулярных выражений, позволяющие ссылаться на разделы согласованного шаблона.
Perl также поддерживает именованные записи, которые, возможно, легче запомнить людям в некоторых случаях.
данный вход: 111 222
/(\d+)\s+(\d+)/
$1 равно 111
$2 равно 222
Можно также сказать:
/(?<myvara>\d+)\s+(?<myvarb>\d+)/
$+ {myvara} - 111
$+ {myvarb} - 222
Они называются "Match Variables". Как уже упоминалось ранее, они содержат текст из вашего последнего соответствия регулярному выражению.
Дополнительная информация здесь: http://cslibrary.stanford.edu/108/EssentialPerl.html
(CTRL-F для 'Match Variables', чтобы найти соответствующий раздел)
В общих вопросах, касающихся "магических" переменных в Perl, можно ответить, посмотрев в документации предопределенных переменных Perl a la:
perldoc perlvar
Однако при поиске этой документации за $1 и т.д. Вы найдете ссылки в нескольких местах, кроме раздела этих "цифровых" переменных. Вы должны искать
$<digits>
Я бы добавил это к Брайану ответ либо путем комментирования, либо редактирования, но мне не хватает репутации. Если кто-то добавит это, я удалю этот ответ.
Поскольку вы спросили группы захвата, вы, возможно, захотите узнать о $+ тоже.. Довольно полезно..
use Data::Dumper;
$text="hiabc ihabc ads byexx eybxx";
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs)
{
print Dumper $+;
}
ВЫВОД:
$ VAR1 = 'hi';
$ VAR1 = 'ih';
$ VAR1 = 'bye';
$ VAR1 = 'eyb';
Я бы заподозрил, что может быть столько, сколько 2**32 -1
нумерованных переменных соответствия, на 32-битной скомпилированной Perl-бинарнике.
Переменные $1.. $9 также являются переменными только для чтения, поэтому вы не можете имплицитно присваивать им значение:
$1 = 'foo'; print $1;
Это вернет ошибку: изменение значения, доступного только для чтения, в строке script.
Вы также не можете использовать числа для начала имен переменных:
$1foo = 'foo'; print $1foo;
Вышеупомянутое также вернет ошибку.