Perl FAQから(すべての Perl プログラマーが少なくとも一度は読む必要があります):
テキスト文字列内の変数を展開するにはどうすればよいですか?
(ブライアン・フォイによる寄稿)
回避できる場合は、使用しないでください。または、Text::Template や Template Toolkit などのテンプレート システムを使用できる場合は、代わりにそれを使用してください。sprintf
またはで仕事を終わらせることさえできるかもしれません
printf
:
my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
ただし、完全なテンプレート システムを引き出したくないという 1 回限りの単純なケースでは、2 つの Perl スカラー変数を含む文字列を使用します。この例では、変数の値に展開$foo
したいと思います。$bar
my $foo = 'Fred';
my $bar = 'Barney';
$string = 'Say hello to $foo and $bar';
これを行う方法の 1 つは、置換演算子と二重/e
フラグを使用することです。最初のものは置換側で/e
評価され、それを に変換します。2 番目は で始まり、その値に置き換えられます。、次に「Fred」に変わり、それが最終的に文字列に残ります。$1
$foo
/e
$foo
$foo
$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'
はまた/e
、strict の違反を黙って無視し、未定義の変数名を空の文字列に置き換えます。私は/e
フラグを使用しているため (2 回も!)、文字列形式の 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;