On 10/27/25 8:21 AM, William Michels wrote:
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 <perl6-
[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.
Perfect! Thank you!