I've been playing in Perl 6 (after several years of absence). I am very impressed.
I'm porting my recent Date::Reformat into Perl 6, for fun,
to get me back into the Perl 6 headspace, and possibly to help
others, either with something useful, or something they can look
to for examples.
I've run into a snag, in that my strptime processing in Perl 5
relies on building a string that looks like a regex with named
captures, and then interpolating that into a real regex.
In Perl 6, while I am able to interpolate, and match, capturing
does not appear to be allowed/implemented via interpolation (and
there is no quotemeta).
my $pattern = Q/$<greeting>=[hello]/;
my $string = Q/hello/;
# Interpolated regex matches, but does not capture.
my $regex = rx/<{$pattern}>/;
# EVALed regex matches and captures.
my $regex_eval = EVAL "rx/" ~ $pattern ~ "/";
Of course, there may be a better way, since regex interpolation
seems frowned upon in Perl 6.
One idea I have is to generate a grammar, but the only way I've
been able to get that to work is to create a string that looks
like a grammar, and EVAL it. Is that a Perl 6 best-practice, or
is there a better way?
my $generated_grammar = generate_grammar(
top => Q/<year> '-' <month> '-' <day>/,
year => Q/\d**4/,
month => Q/\d\d?/,
day => Q/\d\d?/,
);
my $match = $generated_grammar.parse($date_string);
say $match.perl;
sub generate_grammar (*%tokens) {
my $grammar_string = 'my grammar { rule TOP { ';
# Populate TOP.
$grammar_string ~= %tokens<top>;
$grammar_string ~= ' };';
# Define regexes.
for %tokens.kv -> $name, $regex {
next if $name eq 'top';
$grammar_string ~= " regex $name \{ $regex \};";
}
$grammar_string ~= ' }';
# EVAL into a useable grammar.
say "EVALing grammar into existence: $grammar_string";
my $grammar = EVAL $grammar_string;
return $grammar;
}
It seems like it might be cool to create an action class that
will build a grammar to parse a date in a given format, as an
strptime format string is being parsed. I'm not quite sure yet
what that looks like.
-kolibrie
signature.asc
Description: Digital signature
