Hi Todd, Start by noting the `:g` "global" adverb (named-parameter). This means Raku will try to match the regex pattern against input multiple times. Basically Raku will start from the left end of the input string, and try to find a match. The match will continue until the regex pattern fails. Then (because of the :global adverb), Raku moves down a character and starts all over again.
Without the zero-width start/end-of-line/string assertions, this is what you get: [0] > .Str.say for "first line\nsecond line" ~~ m:g/ \w+ / first line second line See remaining comments inline: > On Oct 26, 2025, at 21:35, ToddAndMargo via perl6-users > <[email protected]> wrote: > > On 10/26/25 8:51 PM, William Michels wrote: >> In the Raku REPL: >> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^ \w+ / >> first >> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^^ \w+ / >> first >> second >> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $ / >> second >> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $$ / >> first >> second >> HTH, Bill. >>> On Oct 26, 2025, at 14:50, ToddAndMargo via perl6-users <perl6- >>> [email protected]> wrote: >>> >>> On 10/26/25 7:56 AM, William Michels wrote: >>>> ^^ has the regex meaning "start-of-line" >>>> $$ has the regex meaning "end-of-line" >>>> Compare to: >>>> ^ has the regex meaning "start-of-string" >>>> $ has the regex meaning "end-of-string" >>>> If you're analyzing input linewise (for example using a one-liner with >>>> `-ne` or `-pe` flags), >>>> then start-of-line equals start-of-string, and end-of-line equals end- >>>> of-string. >>>> HTH, Bill. >>> >>> >>> Can I talk you out of a few examples? > > Hi Bill, > > Thank you! > > Would you double check my understanding? > > -T > > > Extract the first (^) word (\w+) from the first line > [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^ \w+ / > first Above: CLOSE. Raku takes an input string, and is asked to find the `\w+` characters immediately adjacent to the `^` start-of-string zero-width assertion. There is only one "start-of-string". FYI, because you never ask Raku to interrogate line-related information (e.g. match a `^^` or `$$` or "\n" or "\v"), Raku has no idea whether the input string is one line or many lines. > > Extract the first (^^) word (\w+) from all the lines > [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^^ \w+ / > first > second Above: CORRECT (although you might want to say "...from EACH of the lines"). > > Extract the last ($) word (\w+) from the last line > [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $ / > second Above: CLOSE. Raku takes an input string, and is asked to find the `\w+` characters immediately adjacent to the `$` end-of-string zero-width assertion. There is only one "end-of-string". Again, because you never ask Raku to interrogate line-related information (e.g. match a `^^` or `$$` or "\n" or "\v"), Raku has no idea whether the input string is one line or many lines. > > Extract the last ($$) word (\w+) from all the lines > [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $$ / > first > second Above: CORRECT (although you might want to say "...from EACH of the lines"). HTH, Bill.
