use strict; use warnings; use Parse::RecDescent; use Switch; use Scalar::Util 'blessed'; my $grammar = q( startrule : day month date day : "Sat" | "Sun" | "Mon" | "Tue" | "Wed" | "Thu" | "Fri" month : "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec" date: /\d+/ ); my $parser = Parse::RecDescent->new($grammar); my $tree = $parser->startrule("Thu Mar 31"); visit($tree); sub visit { my ($v) = @_; if ( blessed($v) ) { switch ( ref($v) ) { case "date" { print "The date is: ", $v->{__VALUE__}, "\n"; } case "month" { print "The month is: ", $v->{__VALUE__}, "\n"; } } foreach my $key ( keys %$v ) { visit( $v->{$key} ); } } }