This is the idiom I've always used to get a modified copy of a string without changing the original:
(my $newstring = $oldstring) =~ s/foo/bar/g;
In perl 5.14.0 or later, you can use the new
/r non-destructive substitution modifier:
my $newstring = $oldstring =~ s/foo/bar/gr;
The above solutions work without
g too. They also work with any other modifiers.