That's a fun question, Josef!
I don't think you can pass a replacement phrase around, so this is all I
came up with:
sub substitute_lines {
my ($contents, $subst) = @_;
$contents = $subst->($contents);
return $contents;
}
my $data = "foo whatever bar";
print(substitute_lines($data, sub { $_[0] =~ s/^foo (whatever) bar$/bar $1
baz/mgr } ));
I'd be very pleased if someone could come up with a more elegant solution.
On Wed, Oct 25, 2023 at 6:34 PM Josef Wolf <[email protected]> wrote:
> Hallo all,
>
> maybe this is not exactly a beginner question, but I could not find an
> appropriate mailing list (all other lists seem to be developer realted).
>
>
> 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.
>
> Experiments which also do not work:
>
>
> &substitute_lines ($data, qr/^foo (whatever) bar$/mg, "bar $1 baz");
> # obviously, $1 is interpolated _before_ re-match is done
>
>
> &substitute_lines ($data, qr/^foo (whatever) bar$/mge, '"bar $1 baz"');
> # /e modifier not accepted
>
> Any hints?
>
> --
> Josef Wolf
> [email protected]
>
> --
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> http://learn.perl.org/
>
>
>