I know the right way to do this if I have Perl 5.10 is to use named captures and values %+
, but in Perl 5.8.9 and how can I get a list of successful captures? I have come up with two methods that are both just terrible:
#you need to list each possible match
my @captures = grep { defined } ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16);
and
#ew, I turned on symbolic references
{
no strict 'refs';
my @captures = map { defined $+[$_] ? $$_ : () } 1 .. $#+;
}
There is a third option I have found involving (?{})
, but it requires global variables (because the closure happens at compile time) and takes the regex from reasonably clear to ungodly mess.
The only alternative I have found is to capture the whole match and then use another set of regexes to get the values I want (actually I build the first regex out of the other regexes because there is no good reason to duplicate the logic).
I obvious left out an important piece of information. I am using the regex in scalar context along with the \G
assertion because the regex can change between matches (one of the tokens changes the way you grab tokens off the string). For an example of the code written for Perl 5.10, see this question, specifically this answer.