This requires a nested loop:
use strict; use warnings; my %reglist = ( qr/food?/ => sub { print "\t1\n" }, qr/b[a4]rd?/ => sub { print "\t2\n" }, qr/baz(o+ka)?/ => sub { print "\t3\n" } ); foreach (qw(foobarbaz football barcode none bazoooooka)) { print "$_\n"; for my $regex (keys %reglist) { $reglist{$regex}() if /$regex/; } }
UPDATE: If you are happy NOT to use captures in your regexes, you can just see which one has matched from the position in the matches. Due to this restriction I have changed your third regex to non-capturing parantheses.
use warnings; my @reglist = ( qr/food?/, qr/b[a4]rd?/, qr/baz(?:o+ka)?/ ); my $giant = join( ")|(", @reglist ); foreach (qw(foobarbaz football barcode none bazoooooka)) { my @hits = /($giant)/; my @which = map { defined $hits[$_] ? $_ : "" } 0..@hits-1; print "$_: @which\n"; }
In reply to Re: Find out which subpattern matched in regex
by hdb
in thread Find out which subpattern matched in regex
by Dallaylaen
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |