Что означает $ 1 в Perl? - PullRequest
60 голосов
/ 24 июня 2009

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

Ответы [ 9 ]

63 голосов
/ 24 июня 2009

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

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

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

После выписки

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

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

33 голосов
/ 24 июня 2009

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

my $string = 'abcdefghi';

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

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

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

11 голосов
/ 24 июня 2009

$ 1, $ 2 и т. Д. Будут содержать значения перехватов с последнего успешного матча - важно проверить, было ли совпадение успешным, прежде чем обращаться к ним, т.е.

 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";
9 голосов
/ 24 июня 2009

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

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

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

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

1 $ - 111

2 доллара США - 222

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

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

$ + {myvara} равно 111

$ + {myvarb} - 222

6 голосов
/ 24 июня 2009

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

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

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

2 голосов
/ 17 февраля 2017

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

use Data::Dumper;
$text="hiabc ihabc ads byexx eybxx";
while($text=~/(hi|ih)abc|(bye|eyb)xx/igs)
{
    print Dumper $+;
}

ВЫВОД:
$ VAR1 = 'привет';
$ VAR1 = 'ih';
$ VAR1 = 'пока';
$ VAR1 = 'eyb';

2 голосов
/ 25 июня 2009

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

perldoc perlvar

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

$<digits>

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

0 голосов
/ 24 июня 2009

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

0 голосов
/ 24 июня 2009

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

$ 1 = 'foo'; печать 1 $

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

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

$ 1foo = 'foo'; выведите $ 1foo;

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

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