Re: Using qr// with substitution and group-interpolation in thesubstitution part

[email protected] (gordonfish) Tue, 21 Nov 2023 15:21:04 -0800
Newsgroups perl.beginners
Message-ID <[email protected]>
On 10/25/23 10:32, Josef Wolf wrote:
[...]
> Basically, I want to do the same as
> 
> 
>    $data =~ s/^foo (whatever) bar$/bar $1 baz/mg;
> 
> 
> but with a different interface (because it has to be embedded into a bigger
> project), So I have come with this;
> 
> 
>    sub substitute_lines {
>        my ($contents, $regex, $subst) = @_;
>            $contents =~ s/$regex/$subst/mg;
>            return $contents;
>        }
>    }
> 
>    &substitute_lines ($data, qr/^foo (whatever) bar$/mg, 'bar $1 baz');
> 
> 
> Which (mostly) works as expected. Unfortunately, this won't interpolate the
> matched group $1.
[...]

You could so something like:

use feature qw(signatures);

sub substitute_lines($contents, $regex, $subst) {
     $contents =~ s/$regex/$subst->()/emgr;
}

...

substitute_lines
     $data,
     qr/^foo (whatever) bar$/,
     sub { "bar $1 baz" };


This will pass an anonymous sub routine which will be called from s/// 
replacement side thanks to the /e modifier that allows code to be 
executed there.

Also of some note is that the /r modifier is used so that s/// returns 
the resulting string instead of modifying $contents, and being the last 
statement, said resulting string is the return value.

-- 
gordonfish