При обработке CA :: Parser , связанной со совпадениями для /$CA::Regex::Parser{Kills}{all}/
, вы используете перехваты $1
вплоть до $10
, и большинство остальных использует меньше. Если под числом совпадений вы подразумеваете количество захватов (самое большое n , для которого $n
имеет значение), вы можете использовать специальный массив Perl @-
(выделение добавлено):
@ LAST_MATCH_START
@ -
$-[0]
- смещение начала последнего успешного матча. $-[n]
- это смещение начала подстроки, совпадающее с n -ым подшаблоном или undef
, если подшаблон не совпадает.
Таким образом, после матча с $_
, $&
совпадает с substr $_, $-[0], $+[0] - $-[0]
. Точно так же $n
совпадает с
substr $_, $-[n], $+[n] - $-[n]
, если определено $-[n]
и $+
совпадает с
substr $_, $-[$#-], $+[$#-] - $-[$#-]
Можно использовать $#-
, чтобы найти последнюю найденную подгруппу в последнем удачном совпадении. Сравните с $#+
, количеством подгрупп в регулярном выражении. Сравните с @+
.
Этот массив содержит смещения начала последних успешных субматч в текущей активной динамической области. $-[0]
- смещение в строку начала всего матча. n -й элемент этого массива содержит смещение n-го субматча, поэтому $-[1]
- это смещение, с которого начинается $1
, $-[2]
смещение, с которого начинается $2
, и так далее.
После совпадения с некоторой переменной $var
:
- $ `совпадает с
substr($var, 0, $-[0])
$&
совпадает с substr($var, $-[0], $+[0] - $-[0])
$'
совпадает с substr($var, $+[0])
$1
совпадает с substr($var, $-[1], $+[1] - $-[1])
$2
совпадает с substr($var, $-[2], $+[2] - $-[2])
$3
совпадает с substr($var, $-[3], $+[3] - $-[3])
Пример использования:
#! /usr/bin/perl
use warnings;
use strict;
my @patterns = (
qr/(foo(bar(baz)))/,
qr/(quux)/,
);
chomp(my @rawfile = <DATA>);
foreach my $pattern (@patterns) {
LINE: for (@rawfile) {
/$pattern/ && do {
my $captures = $#-;
my $s = $captures == 1 ? "" : "s";
print "$_: got $captures capture$s\n";
};
}
}
__DATA__
quux quux quux
foobarbaz
Выход:
foobarbaz: got 3 captures
quux quux quux: got 1 capture