Как я уже говорил вам в группе Perl Programmers Facebook, это очень похоже на один из ответов в FAQ по Perl.
How can I expand variables in text strings?
Если вы можете избежать этого, нет, или если вы можете использовать шаблонную систему, такие как Text :: Template или Template Toolkit, сделать это вместо этого.Вы могли бы даже быть в состоянии получить работу с sprintf
или printf
:
my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
Однако для единовременного простого случая, когда я не хочу, чтобы вытащить полную шаблонную систему, я буду использовать строка, в которой есть две скалярные переменные Perl. В этом примере я хочу расширить $ Foo и $ бар до значений их переменных:
my $foo = 'Fred';
my $bar = 'Barney';
$string = 'Say hello to $foo and $bar';
Один из способов я могу сделать, это связан с оператором подстановки и двойной /e
флага. Первый /e
оценивает $1
на замену и превращает его в $foo
. Второй /e
начинается с $foo
и заменяет его своим значением. $foo
, а затем превращается в «Фред», и что, наконец, то, что осталось в строке:
$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;
'My $ store = 'Media Markt'; my $ sentence = "Я посетил $ store"; print $ sentence; ' – AbhiNickz
см. Также: http://stackoverflow.com/q/1091634/632407 – jm666
См. [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone -answers) – zdim