Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot

Re: Regex - backreferencing multiple matches in one group.

by clinton (Priest)
on Mar 04, 2008 at 11:36 UTC ( #671848=note: print w/replies, xml ) Need Help??

in reply to Regex - backreferencing multiple matches in one group.

Your captures will always be numbered according to the leftmost opening parenthesis, for instance:
'abcdef' =~ / ( abc ( def) ) /x; $1 -> 'abcdef' $2 -> 'def'

So you have two options here. You can either specify each matching group, or match in a loop. For instance:

use Data::Dumper; my $table_ref="!Frequency[A][B][C] ..some other text.."; ### Groups specified explicitly my $var_rx = qr / \[ ( [^\]]+ ) \] /x; my $file_rx = qr / ! ( [^\[]+ ) /x; my $regex = qr/^ $file_rx $var_rx $var_rx? $var_rx? $var_rx? \s ++.*/x; my @matches = ( $table_ref =~ /$regex/); print Dumper (\@matches); ## Loop my ($filename) = ($table_ref =~ /^ $file_rx /gcx ); my @vars; while ( $table_ref =~ /\G $var_rx/gcx ) { push @vars,$1; } print Dumper($filename,\@vars);

See perlre for an explanation of \G and /c


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://671848]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (2)
As of 2017-03-27 04:24 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (315 votes). Check out past polls.