Regexp capture group list
Philip Newton
philip.newton at gmail.com
Tue Nov 10 13:37:59 GMT 2009
On Tue, Nov 10, 2009 at 14:11, Paul LeoNerd Evans
<leonerd at leonerd.org.uk> wrote:
> After some headscratching I decided instead to have parse() return a
> list of the capture groups. I so far haven't found a neater expression
> than
>
>
> sub parse
> {
> my ( $text, $re ) = @_;
> $_[0] =~ s/^$re// or die "Expected $re in $text...\n";
>
> return map { substr $text, $-[$_], $+[$_]-$-[$_] } 1 .. $#+
> }
>
>
> This seems a common-enough idiom that perhaps there's a neater solution
> - I find there's no @{^MATCHGROUPS} or similar present in perl...
>
> Can anyone offer any neater suggestions?
For matches, you can use list context assignment, which will give you
the groups. Unfortunately, that doesn't work for substitutions, which
always return a count of substitutions made.
But you could try this:
sub parse
{
my ( $text, $re ) = @_;
my @matches = $_[0] =~ /^$re// or die "Expected $re in $text...\n";
$_[0] =~ s/^$re//;
return @matches
}
at the cost of running the regexp twice (once for matching and
capturing, then once for substituting).
Cheers,
Philip
--
Philip Newton <philip.newton at gmail.com>
More information about the london.pm
mailing list