I’m not familiar with Parse::RecDescent, but by reference to the docs plus a bit of trial-and-error I got this to work by adjusting the regex and assigning $1 to a local variable (see the section “Start-up Actions” in Parse::RecDescent):
#! 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);
Output:
18:38 >perl 505_SoPW.pl -->./foo<-- $VAR1 = { 'dir' => './foo' }; 18:51 >
Note that setting $::RD_TRACE = 1; is useful for understanding what the parser is doing.
Hope that helps,
| Athanasius <°(((>< contra mundum | Iustus alius egestas vitae, eros Piratica, |
In reply to Re^2: Why won't this basic Parse::RecDescent example work?
by Athanasius
in thread Why won't this basic Parse::RecDescent example work?
by 7stud
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |