То, что вы описываете, это шаблон. В CPAN существует множество систем шаблонов различной степени сложности. Text :: Template и Template Toolkit - пара популярных. Вы не хотите, чтобы ваши шаблоны обращались к произвольным переменным; это дыра в безопасности. Вместо этого поместите переменные, к которым им разрешен доступ, в хеш.
Если все, что вам нужно, это очень простая система, вы можете сделать что-то вроде этого:
sub fill_in_template
{
my ($text, $values) = @_;
$text =~ s/ \$\{ ( [^}\s]+ ) \} /$values->{$1}/gx;
return $text;
}
my %txt;
my %values = (name => 'Your Name');
my $template = 'Hello ${name}, How are you?'; # $name NOT interpolated
$txt{'hello'} = fill_in_template($template, \%values);
print "<tag>$txt{'hello'}</tag>\n";
Вы можете добавить некоторую проверку ошибок, если шаблон использует поле, которое не определено. Но если вам нужно что-то более сложное, возможно, вам лучше выбрать существующую систему шаблонов из CPAN.
Locale :: Maketext предназначен для интернационализации (поэтому ваше приложение может производить вывод на нескольких языках без необходимости работать с кодом переводчикам напрямую) и не является тем механизмом шаблонов, который вам нужен для.