use Data::Dumper; use Hash::Merge qw(merge); ### 1 ### '1a2b3c' =~ /(?:(?\d)(?[a-z]))+/; print Dumper(\%-); ### 2 ### my %match; while ('1a2b3c' =~ /\G(?\d)(?[a-z])/gc) { %match = %{ merge(\%match, \%-) }; } print Dumper(\%match); #### $VAR1 = { 'digit' => [ '3' ], 'letter' => [ 'c' ] }; $VAR1 = { 'digit' => [ '1', '2', '3' ], 'letter' => [ 'a', 'b', 'c' ] };