Что означает $ 1 в Perl?

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

62
задан brian d foy 24 June 2009 в 17:27
поделиться

8 ответов

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

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

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

После оператора

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

$ 1 соответствует тексту « коричневый ».

65
ответ дан 24 November 2019 в 16:17
поделиться

$ 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";
11
ответ дан 24 November 2019 в 16:17
поделиться

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

perldoc perlvar

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

$<digits>

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

2
ответ дан 24 November 2019 в 16:17
поделиться

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

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

Дан ввод: 111 222

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

$ 1 равен 111

$ 2 равен 222

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

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

$ + {myvara} равно 111

$ + { myvarb} - это 222

9
ответ дан 24 November 2019 в 16:17
поделиться

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

$ 1 = 'foo'; print $ 1;

Это вернет ошибку: Попытка изменить значение только для чтения в строке сценария 1.

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

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

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

0
ответ дан 24 November 2019 в 16:17
поделиться

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

0
ответ дан 24 November 2019 в 16:17
поделиться

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

Дополнительная информация находится в Essential Perl . ( Ctrl + F для «Сопоставить переменные», чтобы найти соответствующий раздел.)

6
ответ дан 24 November 2019 в 16:17
поделиться

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

my $string = 'abcdefghi';

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

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

Регулярные выражения Perl описаны в perlre .

35
ответ дан 24 November 2019 в 16:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: