9 ответов:
The
$numberпеременные содержат части строки, которая соответствует группы захвата( ... )в шаблоне для вашего последнего матча регулярного выражения, если матч был успешным.например, возьмите следующую строку:
$text = "the quick brown fox jumps over the lazy dog.";после заявления
$text =~ m/ (b.+?) /;
равно текст "brown".
числовые переменные совпадают с последними успешных оператор соответствия или замены, который вы применили:
my $string = 'abcdefghi'; if( $string =~ /(abc)def(ghi)/ ) { print "I found and \n"; }всегда проверяйте, что совпадение или замена были успешными перед использованием $1 и так далее. В противном случае вы можете забрать остатки от другой операции.
регулярные выражения Perl задокументированы в perlre.
$1, $2 и т. д. будет содержать значение захватывает от последней успешных матч-важно проверить, удалось ли матч, прежде чем обращаться к ним, т. е.
if ( $var =~ m/( )/ ) { # use etc... }пример проблемы - $1 содержит "быстрый" в обоих операторах печати ниже:
#!/usr/bin/perl 'Quick brown fox' =~ m{ ( quick ) }ix; print "Found: \n"; 'Lazy dog' =~ m{ ( quick ) }ix; print "Found: \n";
как указывали другие, $ x-это переменные захвата для регулярных выражений, позволяющие ссылаться на разделы согласованного шаблона.
Perl также поддерживает именованные захваты, которые могут быть проще для людей, чтобы помнить в некоторых случаях.
ввод: 111 222
/(\d+)\s+(\d+)/$1-это 111
$2 - это 222
можно также сказать:
/(?<myvara>\d+)\s+(?<myvarb>\d+)/$ + {myvara} is 111
$ + {myvarb} - это 222
Они называются "переменные соответствия". Как уже упоминалось ранее, они содержат текст из вашего последнего соответствия регулярному выражению.
дополнительная информация здесь: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 = 'привет';
$VAR1 = 'ih';
$VAR1 = 'bye';
$VAR1 = 'eyb';
переменные $1 .. $9 также являются переменными только для чтения, поэтому вы не можете неявно присвоить им значение:
$1 = 'foo'; print $1;
это вернет ошибку: изменение значения только для чтения, предпринятое в строке скрипта 1.
вы также не можете использовать числа для начала имен переменных:
$1foo = 'foo'; print $1foo;
выше также вернет ошибку.
Я подозреваю, что их может быть столько, сколько
2**32 -1нумерованные переменные соответствия, на 32-битном скомпилированном двоичном файле Perl.
Comments