Насколько я могу судить, perl не выполняет магические действия с $ replace, если вы не добавляете флаг / e на замену.Таким образом, quotemeta всегда изменит ваш результат, так как он содержит множество обратных наклонных черт.
#!/usr/bin/perl
$test="test";
$literal_replacement='Hello $1, or \1';
my $replace = quotemeta $literal_replacement;
$test =~ s/test/$replace/;
print $test,"\n";
возвращает:
Hello\ \$1\,\ or\ \\1
Что, вероятно, не то, что вы хотите: