use v5.10; use warnings; my %hash = ( do => 'a deer', re => 'a drop of golden sun', mi => 'a name I call myself', fa => 'a long long way to run', ); my $grammar = do { use Regexp::Grammars; qr{ <[_WORD=%hash]>+ <defns=(?{ [@hash{ @{$MATCH{_WORD}} }] })> }xms; }; while (my $line = <>) { if ($line =~ $grammar) { use Data::Dumper 'Dumper'; say Dumper \%/; } } say {*STDERR} 'done!';