Thanks much for your answer on this.  I think this is the sort of
trick I was looking for:

Brad Gilbert<b2gi...@gmail.com> wrote:

> You can put it back in as a named

>     > $input ~~ / <pattern=$pattern>
>     「9 million」
>      pattern => 「9 million」
>       0 => 「9」
>       1 => 「million」

That's good enough, I guess, though you need to know about the
issue... is there some reason it shouldn't happen automatically,
using the variable name to label the captures?

I don't think this particular gotcha is all that well
documented, though I guess there's a reference to this being a
"known trap" in the documentation under "Regex interpolation"--
but that's the sort of remark that makes sense only after you know
what its talking about.

I have to say, my first reaction was something like "if they
couldn't get this working right, why did they put it in?"


On 3/11/21, Brad Gilbert <b2gi...@gmail.com> wrote:
> If you interpolate a regex, it is a sub regex.
>
> If you have something like a sigil, then the match data structure gets
> thrown away.
>
> You can put it back in as a named
>
>     > $input ~~ / <pattern=$pattern>
>     「9 million」
>      pattern => 「9 million」
>       0 => 「9」
>       1 => 「million」
>
> Or as a numbered:
>
>     > $input ~~ / $0 = <$pattern>
>     「9 million」
>      0 => 「9 million」
>       0 => 「9」
>       1 => 「million」
>
> Or put it in as a lexical regex
>
>     > my regex pattern { (\d+) \s+ (\w+) }
>     > $input ~~ / <pattern>  /
>     「9 million」
>      pattern => 「9 million」
>       0 => 「9」
>       1 => 「million」
>
> Or just use it as the whole regex
>
>     > $input ~~ $pattern # variable
>     「9 million」
>      0 => 「9」
>      1 => 「million」
>
>     > $input ~~ &pattern # my regex pattern /…/
>     「9 million」
>      0 => 「9」
>      1 => 「million」
>
> On Thu, Mar 11, 2021 at 2:29 AM Joseph Brenner <doom...@gmail.com> wrote:
>
>> Does this behavior make sense to anyone?  When you've got a regex
>> with captures in it, the captures don't work if the regex is
>> stashed in a variable and then interpolated into a regex.
>>
>> Do capture groups need to be defined at the top level where the
>> regex is used?
>>
>> { #  From a code example in the "Parsing" book by Moritz Lenz, p. 48,
>> section 5.2
>>    my $input = 'There are 9 million bicycles in beijing.';
>>    if $input ~~ / (\d+) \s+ (\w+) / {
>>        say $0.^name;  # Match
>>        say $0;        # 「9」
>>        say $1.^name;  # Match
>>        say $1;        # 「million」
>>        say $/;
>>         # 「9 million」
>>         #  0 => 「9」
>>         #  1 => 「million」
>>    }
>> }
>>
>> say '---';
>>
>> { # Moving the pattern to var which we interpolate into match
>>    my $input = 'There are 9 million bicycles in beijing.';
>>    my $pattern = rx{ (\d+) \s+ (\w+) };
>>    if $input ~~ / <$pattern> / {
>>        say $0.^name;  # Nil
>>        say $0;        # Nil
>>        say $1.^name;  # Nil
>>        say $1;        # Nil
>>        say $/;        # 「9 million」
>>    }
>> }
>>
>> In the second case, the match clearly works, but it behaves as
>> though the capture groups aren't there.
>>
>>
>>    raku --version
>>
>>    Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2020.10.
>>    Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d.
>>
>

Reply via email to