Front page | perl.perl6.users |
Postings from June 2020
Re: interpolating the return from embedded code in a regexp
Thread Previous
|
Thread Next
From:
yary
Date:
June 15, 2020 00:54
Subject:
Re: interpolating the return from embedded code in a regexp
Message ID:
CAG2CFAbWJYsCx83dgQq5FL-Uumsmjf7NcdYcErsi6O38Pq91wg@mail.gmail.com
I should have read the output!
This one gives the right answers but with lots of warnings
/ (^P\d+) \s+ $("%products{$0}") /
checking line: P123 Viridian Green Label Saying Magenta
Use of Nil in string context
in regex at regex-loop.p6 line 18
Use of Nil in string context
in regex at regex-loop.p6 line 18
Use of uninitialized value %products{''} of type Any in string context.
Methods .^name, .perl, .gist, or .say can be used to stringify it to
something meaningful.
in regex at regex-loop.p6 line 18
Matched, line looks good
checking line: P666 Yoda puppets
NO: bad line.
...
Why is it reading with an empty-string $0 in %products{''}
-y
On Sun, Jun 14, 2020 at 5:47 PM Joseph Brenner <doomvox@gmail.com> wrote:
> Well, with the first one it rejects all of my lines, and with the
> second one it passes all of them.
>
> Just to be be clear, my idea is the second line is wrong, and it
> should flag that one as a problem....
>
>
>
> On 6/14/20, yary <not.com@gmail.com> wrote:
> > https://docs.raku.org/language/regexes#Regex_interpolation gave me some
> > ideas
> >
> > Try matching against / (^P\d+) \s+ %products{$0} /
> >
> > This one also works, in a roundabout way
> > / (^P\d+) \s+ {"%products{$0}"} /
> > -y
> >
> >
> > On Sun, Jun 14, 2020 at 4:44 PM Joseph Brenner <doomvox@gmail.com>
> wrote:
> >
> >> In part because of the recent discussion here, I decided to
> >> play around with using Raku code embedded in a regexp.
> >> I came up with a contrived example where I was going to
> >> examine a product listing in a text block to see if the product
> >> descriptions matched the product codes. The valid associations
> >> I have in a hash, so I'm (1) matching for product codes; (2)
> >> using embedded code to look-up the associated description in the hash;
> >> (3) using the returned description inside the regex.
> >>
> >> my %products = ( 'P123' => "Green Labels That Say Magenta",
> >> 'P666' => 'Darkseid For President Bumpersticker',
> >> 'P912' => "Corn dogs",
> >> );
> >>
> >> my $text = q:to/END/;
> >> P123 Viridian Green Label Saying Magenta
> >> P666 Yoda puppets
> >> P912 Corn dogs
> >> END
> >>
> >> my @lines = $text.lines;
> >> say @lines;
> >>
> >> for @lines -> $line {
> >> say "checking line: $line";
> >> ## This line works, but it's not a complete solution:
> >> if $line ~~ / (^P\d+) \s+ <{ %products{$0}.subst(/\s+/, '\s', :g) }>
> /
> >> {
> >> say "Matched, line looks good";
> >> }
> >> else {
> >> say "NO: bad line.";
> >> }
> >> }
> >>
> >> I'd thought that a line like this would work:
> >>
> >> if $line ~~ / (^P\d+) \s+ <{ %products{$0} }> / {
> >>
> >> The trouble though is I've got spaces inside the descriptions,
> >> so if the returned string is treated as a regexp, I get these
> >> warnings:
> >>
> >> Potential difficulties:
> >> Space is not significant here; please use quotes or :s
> >> (:sigspace) modifier (or, to suppress this warning, omit the space, or
> >> otherwise change the spacing)
> >>
> >> Reading a bit, I thought this should work
> >>
> >> if $line ~~ / (^P\d+) \s+ $( %products{$0} ) / {
> >>
> >> That's supposed to use the return string as a literal match.
> >> Instead I get a lot of strange messages like:
> >>
> >> Use of Nil in string context in regex
> >>
> >> Flailing around I considered lots of variations like this:
> >>
> >> if $line ~~ / (^P\d+) \s+ Q[<{ %products{$0}}>] / {
> >>
> >> But I think that ends up treating everything inside the Q[]
> >> literally, so you never do the hash lookup.
> >>
> >> Another thing that might solve this problem is some sort of
> >> regexp quote function I could use inside the code before
> >> returning the string, but I don't know what that would be...
> >>
> >
>
Thread Previous
|
Thread Next