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 <doom...@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....@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 <doom...@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... > >> > > >