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); } } #### Dump for pattern1: $HASH1 = { section_id => 123 }; Dump for pattern2: $HASH1 = { para_id => 256 };