The following may be what you want. Note the @captures = map... line in particular.
use warnings; use strict; use Data::Dump::Streamer; my %patterns = ( pattern1 => { 'regex' => qr'^/section/([\d]{1,8})/?$', 'function' => 'do__section', 'id_fields' => ['section_id'] }, pattern2 => { 'regex' => qr'^/para/([\d]{1,8})/?$', 'function' => 'do__para', 'id_fields' => ['para_id'] } ); my @lines = ('/section/123', '/para/256'); for my $line (@lines) { for my $key (keys %patterns) { next if $line !~ /$patterns{$key}->{regex}/; my @captures = map {substr $line, $-[$_], $+[$_] - $-[$_] + 1} 1.. +$#-; my %args; @args{@{$patterns{$key}->{'id_fields'}}} = @captures; print "Dump for $key:\n"; Dump (\%args); } }
Prints:
Dump for pattern1: $HASH1 = { section_id => 123 }; Dump for pattern2: $HASH1 = { para_id => 256 };
In reply to Re: regex question - dynamically address captures
by GrandFather
in thread regex question - dynamically address captures
by nmerriweather
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |