Подтвердить что ты не робот

Что означает 1 доллар в Perl?

Что означает $1 в Perl? Кроме того, что означает $2? Сколько здесь числовых переменных?

4b9b3361

Ответ 1

Переменные $number содержат части строки, которые соответствуют группам захвата ( ... ) в шаблоне для вашего последнего соответствия регулярному выражению если матч прошел успешно.

Например, возьмите следующую строку:

$text = "the quick brown fox jumps over the lazy dog.";

После утверждения

$text =~ m/ (b.+?) /;

$1 равен тексту "brown".

Ответ 2

Числовые переменные - это совпадения от последнего успешного совпадающего или замещающего оператора:

my $string = 'abcdefghi';

if( $string =~ /(abc)def(ghi)/ ) {
    print "I found $1 and $2\n";
    }

Всегда проверяйте, что совпадение или замена были успешными, прежде чем использовать $1 и так далее. В противном случае вы можете получить остатки от другой операции.

Регулярные выражения Perl документируются в perlre.

Ответ 3

$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";

Ответ 4

Как указывали другие, $x - это переменные захвата для регулярных выражений, позволяющие ссылаться на разделы согласованного шаблона.

Perl также поддерживает именованные записи, которые, возможно, легче запомнить людям в некоторых случаях.

данный вход: 111 222

/(\d+)\s+(\d+)/

$1 равно 111

$2 равно 222

Можно также сказать:

/(?<myvara>\d+)\s+(?<myvarb>\d+)/

$+ {myvara} - 111

$+ {myvarb} - 222

Ответ 5

Они называются "Match Variables". Как уже упоминалось ранее, они содержат текст из вашего последнего соответствия регулярному выражению.

Дополнительная информация здесь: http://cslibrary.stanford.edu/108/EssentialPerl.html

(CTRL-F для 'Match Variables', чтобы найти соответствующий раздел)

Ответ 6

В общих вопросах, касающихся "магических" переменных в Perl, можно ответить, посмотрев в документации предопределенных переменных Perl a la:

perldoc perlvar

Однако при поиске этой документации за $1 и т.д. Вы найдете ссылки в нескольких местах, кроме раздела этих "цифровых" переменных. Вы должны искать

$<digits>

Я бы добавил это к Брайану ответ либо путем комментирования, либо редактирования, но мне не хватает репутации. Если кто-то добавит это, я удалю этот ответ.

Ответ 7

Поскольку вы спросили группы захвата, вы, возможно, захотите узнать о $+ тоже.. Довольно полезно..

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';

Ответ 8

Переменные $1.. $9 также являются переменными только для чтения, поэтому вы не можете имплицитно присваивать им значение:

$1 = 'foo'; print $1;

Это вернет ошибку: изменение значения, доступного только для чтения, в строке script.

Вы также не можете использовать числа для начала имен переменных:

$1foo = 'foo'; print $1foo;

Вышеупомянутое также вернет ошибку.

Ответ 9

Я бы заподозрил, что может быть столько, сколько 2**32 -1 нумерованных переменных соответствия, на 32-битной скомпилированной Perl-бинарнике.