In CA::Parser's processing associated with matches for /$CA::Regex::Parser{Kills}{all}/
, you're using captures $1
all the way through $10
, and most of the rest use fewer. If by the number of matches you mean the number of captures (the highest n for which $n
has a value), you could use Perl's special @-
array (emphasis added):
@LAST_MATCH_START
@-
$-[0]
is the offset of the start of the last successful match. $-[n]
is the offset of the start of the substring matched by n-th subpattern, or undef
if the subpattern did not match.
Thus after a match against $_
, $&
coincides with substr $_, $-[0], $+[0] - $-[0]
. Similarly, $n
coincides with
substr $_, $-[n], $+[n] - $-[n]
if $-[n]
is defined, and $+
coincides with
substr $_, $-[$#-], $+[$#-] - $-[$#-]
One can use $#-
to find the last matched subgroup in the last successful match. Contrast with $#+
, the number of subgroups in the regular expression. Compare with @+
.
This array holds the offsets of the beginnings of the last successful submatches in the currently active dynamic scope. $-[0]
is the offset into the string of the beginning of the entire match. The n-th element of this array holds the offset of the nth submatch, so $-[1]
is the offset where $1
begins, $-[2]
the offset where $2
begins, and so on.
After a match against some variable $var
:
- $` is the same as
substr($var, 0, $-[0])
$&
is the same as substr($var, $-[0], $+[0] - $-[0])
$'
is the same as substr($var, $+[0])
$1
is the same as substr($var, $-[1], $+[1] - $-[1])
$2
is the same as substr($var, $-[2], $+[2] - $-[2])
$3
is the same as substr($var, $-[3], $+[3] - $-[3])
Example usage:
#! /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
Output:
foobarbaz: got 3 captures
quux quux quux: got 1 capture