I know the right way to do this if I have Perl 5.10 to use named captures and values %+ , but in Perl 5.8.9 and how can I get a list of successful captures? I came up with two methods that are 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 that I found involving (?{}) , But this requires global variables (because closure occurs at compile time) and takes a regular expression from reasonably understandable to unholy mess.
The only alternative I found is to capture the entire match and then use a different set of regular expressions to get the values that I want (in fact, I create the first regular expression from other regular expressions because there is no good reason to duplicate the logic).
I obviously left an important piece of information. I use regex in a scalar context along with the \G statement, because the regex can change between matches (one of the tokens changes the way it grabs tokens from a string). For example code written for Perl 5.10, see this question , specifically this answer .
source share