#!/usr/bin/perl use strict; use warnings; use Data::Dumper; print Dumper({ named_match("{foo} {bar}", "one two" ) }); print Dumper({ named_match("{baz} - {qux}", "three - four - five") }); sub named_match { my ($pattern, $string) = @_; my @names; for my $token ($pattern =~ /{([^}]+)}/g) { $token = quotemeta $token; $pattern =~ s/{$token}/(.*)/; push @names, $token; } my %matches; @matches{@names} = $string =~ /$pattern/; return %matches; }