Vous inventer votre propre système de modèles. Et il semble peu probable que vous inventiez quelque chose d'aussi flexible ou puissant que ceux que nous avons déjà. Donc, je vous recommande d'utiliser quelque chose comme the Template Toolkit à la place.
Mais si vous voulez continuer avec votre plan, vous devriez lire la section correspondante de the FAQ.
How can I expand variables in text strings?
(contribution de brian d foy)
Si vous ne pouvez l'éviter, ne sont pas, ou si vous pouvez utiliser un système de modèles, tels que Text :: Template ou Template Toolkit , faites cela à la place. Vous pourriez même être en mesure de faire le travail avec sprintf
ou printf
:
my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
Cependant, pour l'unique cas simple où je ne veux pas sortir un système de modèles complète, je vais utiliser un chaîne qui contient deux variables scalaires Perl. Dans cet exemple, je veux développer $foo
et $bar
à leur valeurs de variables:
my $foo = 'Fred';
my $bar = 'Barney';
$string = 'Say hello to $foo and $bar';
Une façon que je peux faire cela implique l'opérateur de substitution et un double /e
drapeau. Le premier /e
évalue $1
sur le côté de remplacement et le transforme en $foo
. Le second /e
commence par $ foo et le remplace par sa valeur. $foo
, puis, se transforme en « Fred », et c'est finalement ce qui reste dans la chaîne:
$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'
Le /e
ignorera également en silence les violations de stricte, en remplaçant les noms de variables non définies par la chaîne vide. Depuis que je suis en utilisant la, j'ai tous les mêmes problèmes de sécurité que j'ai avec eval sous sa forme de chaîne drapeau /e
(deux fois même!). S'il y a quelque chose d'étrange dans $foo
, peut-être quelque chose comme @{[ system "rm -rf /" ]}
, alors je pourrais avoir moi-même des ennuis.Pour contourner le problème de sécurité, je pourrais également tirer les valeurs d'un hachage au lieu d'évaluer les noms de variables. En utilisant un seul /e
, je peux vérifier le hachage pour m'assurer que la valeur existe, et si ce n'est pas le cas, je peux remplacer la valeur manquante par un marqueur, dans ce cas ??? signaler que je manqué quelque chose:
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;
intérieur regex vous pouvez utiliser '\ Q .. \ e'. En fait '$ str = ~ s /% {nom}/$ replace/g;', cela fonctionnera, dans votre question initiale vous concaténez les valeurs tout en faisant la substitution. – mkHun