How would one do s/(.+),(.+)/$1,$0/ using .subst ?
-y

On Sun, Apr 19, 2020 at 6:21 PM Tobias Boege <t...@taboege.de> wrote:

> On Sun, 19 Apr 2020, yary wrote:
> > Question from today's Raku meetup. This works in a way I expect
> >
> > > 'fosdffgg'.subst(/f+/,"( "~ * ~" )", :g);
> > ( f )osd( ff )gg
> >
> > This one, $0 gets the single f each time
> >
> > > 'fosdffgg'.subst(/(f+)/,"( $0 )", :g);
> > ( f )osd( f )gg
> >
> > Bug or misunderstanding on my part?
> >
>
> Not a bug. You are calling the subst method on a string. Naturally, in
> order
> to perform the call, all the arguments you pass have to be evaluated first.
> This includes interpolating $0 into the string "( $0 )". You take whatever
> $0 contains, put it into a string and pass that into subst. In your case $0
> seemed to confusingly stringify to "f". Consider this instead:
>
>   "oops" ~~ /^(..)/ andthen say 'fosdffgg'.subst(/(f+)/,"( $0 )", :g)
>   # OUTPUT: «( oo )osd( oo )gg»
>
> where I deliberately set $0 beforehand.
>
> Your first variant works because you pass a Callable into subst and when
> you
> do that subst will repeatedly evaluate the Callable. Not so when you pass a
> string value.
>
> Regards,
> Tobias
>
> --
> "There's an old saying: Don't change anything... ever!" -- Mr. Monk
>

Reply via email to