Hi there, On 11.03.21 17:43, William Michels wrote: > Hi Moritz your book is mentioned below. Care to chime in? Reply to > perl6-users <perl6-users@perl.org> . > > Thx, Bill. > W. Michels, Ph.D. > > ---------- Forwarded message --------- > From: Joseph Brenner <doomvox@gmail.com> > Date: Thu, Mar 11, 2021 at 12:28 AM > Subject: Working with a regex using positional captures stored in a variable > To: perl6-users <perl6-users@perl.org> > > > 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. $0 is an alias for $/[0]. When the match is in a different variable, you need to access the capture group as $match[0] instead of its alias $/[0]. Regards, Moritz -- Moritz Lenz https://perlgeek.de/ -- https://raku.org/Thread Next