#! perl use strict; use warnings; use 5.012; use Data::Dumper; use Parse::RecDescent; $::RD_ERRORS = 1; # Parser dies when it encounters an error $::RD_WARN = 1; # Enable warnings- warn on unused rules &c. $::RD_HINT = 1; # Give out hints to help fix problems. #$::RD_TRACE = 1; # if defined, also trace parsers' behaviour our %HASH; my $grammar = <<'END_OF_GRAMMAR'; { my $directory; } startrule: from_clause from_clause: 'from' dir(s) { print "-->$directory<--\n"; $main::HASH{dir} = $directory; } dir: m{ ^ ( .*? / .* ) $ }x { $directory = $1; } END_OF_GRAMMAR my $parser = Parse::RecDescent->new($grammar) or die "Bad grammar!\n"; defined $parser->startrule("from ./foo") or print "Bad text!\n"; say Dumper(\%HASH);