Вы можете следовать технике в ответе perlfaq4 на Как я могу расширить переменные в текстовых строках? :
Если вы можете избежать этого, не, или если вы можете использовать систему шаблонов, такую как Text :: Template или Template Toolkit, сделайте это вместо этого.Возможно, вы даже сможете выполнить работу с помощью sprintf или printf:
my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
Однако для одноразового простого случая, когда я не хочу использовать полную систему шаблонов, яиспользуйте строку с двумя скалярными переменными Perl.В этом примере я хочу расширить $ foo и $ bar до значений их переменных:
my $foo = 'Fred';
my $bar = 'Barney';
$string = 'Say hello to $foo and $bar';
Один из способов сделать это - оператор подстановки и флаг double / e.Первый / e оценивает $ 1 на стороне замены и превращает его в $ foo.Секунда / e начинается с $ foo и заменяет его значением.Затем $ foo превращается в 'Fred', и это, наконец, то, что осталось в строке:
$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'
/ e также будет молча игнорировать нарушения строгих правил, заменяя неопределенные имена переменных пустой строкой.Поскольку я использую флаг / e (даже дважды!), У меня все те же проблемы с безопасностью, что и у меня с eval в его строковой форме.Если в $ foo есть что-то странное, возможно, что-то вроде @ {[system "rm -rf /"]}, то у меня могут возникнуть проблемы.
Чтобы обойти проблему безопасности, я мог бы также потянутьзначения из хеша вместо оценки имен переменных.Используя один / e, я могу проверить хеш, чтобы убедиться, что значение существует, и если его нет, я могу заменить отсутствующее значение маркером, в этом случае ???сигнализировать, что я что-то пропустил:
my $string = 'This has $foo and $bar';
my %Replacements = (
foo => 'Fred',
);
# $string =~ s/\$(\w+)/$Replacements{$1}/g;
$string =~ s/\$(\w+)/
exists $Replacements{$1} ? $Replacements{$1} : '???'
/eg;
print $string;