Вот вариант того, как это сделать, который почти идентичен вашему коду с небольшим отличием.
use strict;
use warnings;
sub TemplateReplace {
my($regex, $replacement, $text) = @_;
$$text =~ s/($regex)/$replacement/gs;
}
my $text = "This is a test.";
TemplateReplace("test", "banana", \$text);
print $text;
Это поведение явное вместо неявное . На практике это работает идентично час. Owens result, но использует скалярные ссылки вместо того, чтобы полагаться на понимание поведения массивов.
Это сделает более очевидным для любого читающего ваш код, что функция TemplateReplace намеренно изменяет $ text.
Кроме того, он скажет вам, что вы используете его неправильно, крикнув:
Can't use string ("This is a test.") as a SCALAR ref while "strict refs" in use at replace.pl line 9.
Если вы случайно забыли \ где-нибудь.