> Am 17.04.2015 um 04:34 schrieb Nathan Gray:
> > # Call it if it is a routine. This will capture if requested.
> > return (var)(self) if nqp::istype(var,Callable);
> >
> > This seems to indicate that captures in the embedded regexes
> > should capture.
On Fri, Apr 17, 2015 at 09:47:22AM +0200, Tobias Leich wrote:
> The comment in INTERPOLATE is about "subcaptures"... but if you do not
> capture the interpolated regex itself, you break that chain.
Is there a way to specify several captures?
For instance, if I build a data structure with information about
how to parse pieces from a string, and want to be able to
construct a regex from those pieces (which pieces I include, and
what order they are in will be specified as late as possible),
what is the best way to capture those pieces by name?
# Static data structure.
my %date_parts = (
year => {
regex => rx/\d**4/,
},
month => {
regex => rx/\d\d?/,
},
day => {
regex => rx=\d\d?/,
},
);
# Some made up routine that illustrates building a regex that captures.
my $regex = build_capturing_regex('year', rx/'-'/, 'month', rx/'-'/, 'day');
# The generated $regex looks like this (or matches the same as this):
rx/
$=[\d**4] # The name comes from the key in %date_parts, the value
from the regex value.
'-'
$=[\d\d?]
'-'
$=[\d\d?]
/;
# Compare a date string to the regex.
my $date_string = '2015-04-20';
my $match = $date_string ~~ $regex;
# The $match contains:
~$match # '2015'
~$match # '04'
~$match # '20'
~$match# '215-04-20'
Is there built-in functionality that does what build_capturing_regex()
illustrates? For instance, if the %date_parts data structure is
re-written as a grammar, is there a way to dynamically specify
how regex TOP is defined? Or is there a different way I could
approach this problem that is easier, or fits better with Perl 6?
If I need to write something like build_capturing_regex(), what
is the syntax to combine several pre-existing regexes into a
single regex, in a way that allows for capturing to occur?
If you've been following this thread, you know that I've tried
every syntax I could think of, plus any others that have been
suggested to me. Matching always works. Capturing a single
value works. I have not been able to figure out how to capture
more than one value from a generated/interpolated/constructed
regex (unless I use strings instead of regexes and then EVAL the
string into a regex, but I think I should avoid that, unless
there's no better way).
-kolibrie
signature.asc
Description: Digital signature