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

47

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

  • 1
    Что делать, если не было матча?
  • 3
    Возможно, вам стоит почитать что-то вроде изучения Perl или другого введения в Perl, которое объясняет самые основы языка.
Показать ещё 1 комментарий
Теги:

9 ответов

54
Лучший ответ

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

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

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

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

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

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

  • 3
    Захваты, а не группировки.
  • 1
    что если будет больше одного матча? мы можем как-нибудь получить все спички?
Показать ещё 1 комментарий
30

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

my $string = 'abcdefghi';

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

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

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

  • 0
    Если всегда присутствуют от 1 до 9 долларов, какая ценность, если было меньше девяти совпадений?
  • 3
    От 1 до 9 долларов не всегда есть. Я думаю, что Джим неправильно прочитал справочную страницу. Я цитирую соответствующий раздел: «Вы можете иметь столько скобок, сколько пожелаете. Если у вас более 9 подстрок, переменные $ 10, $ 11, ... ссылаются на соответствующую подстроку. Внутри шаблона \ 10, \ 11 и т. д. ссылаются на подстроки, если до обратной ссылки было хотя бы столько левых скобок, в противном случае (для обратной совместимости) \ 10 совпадает с \ 010, возврат на одну позицию, и \ 11 совпадает с \ 011, вкладка . И т. Д. (\ 1 до \ 9 всегда обратные ссылки.) "
Показать ещё 2 комментария
11

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

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

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

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

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

$1 равно 111

$2 равно 222

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

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

$+ {myvara} - 111

$+ {myvarb} - 222

6

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

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

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

2

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

perldoc perlvar

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

$<digits>

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

1

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

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

0

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

0

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

$1 = 'foo'; print $1;

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню