use warnings; use strict; use Parse::RecDescent; use Data::Dumper; my $string = <new (q{ startrule : jobphrase(s) exphrase(s) jobphrase : "JOB ID=" ex "DESC=" jobquote { $::data{$item[2]}{'desc'} = $item[4]; $::data{$item[2]}{'pred'} ||=[] } exphrase : ex "PRED" ex { push @{$::data{$item[1]}{'pred'}}, @item[3] } jobquote : "'" job "'" {$return = $item[2]} ex : /EX\dJ/ job : /JOB\d/ }); $parser->startrule($string); print Dumper \%data;