En Perl, l'interpolation (substitution de variables) est supportée dans les guillemets doubles ("") et dans certains modèles (par exemple, heredoc). Les scalaires sont interpolés simplement :
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Les tableaux dans les guillemets doubles deviennent une chaîne au format où les éléments sont séparés par le caractère $" (par défaut — espace) :
my @items = ('a','b','c'); print "List: @items "; # List: a b c
Les hachages sont substitués sous forme de chaîne clé=>valeur, séparés par le caractère $;
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (peut varier)
Dans les guillemets simples (' '), rien n'est interpolé — la chaîne est affichée littéralement.
Il est également possible d'utiliser des expressions complexes pour l'interpolation à travers des accolades :
print "${name}_test "; # Bob_test
Le danger — une interpolation accidentelle de caractères spéciaux et la différence de comportement des tableaux, des hachages et des scalaires.
Pourquoi la chaîne "Total: $total$val" fonctionne parfois mal ?
Réponse courante : "Tout est substitué tel quel!"
Bonne réponse :
La chaîne "Total: $total$val" peut correctement substituer seulement la variable $total, la variable $val peut ne pas être reconnue ou Perl peut interpoler une plage incorrecte si les noms des variables sont similaires. Pour éviter toute ambiguïté, utilisez des accolades :
print "Total: ${total}${val} ";
Histoire
Histoire 1
Dans les rapports, la ligne de somme ressemblait à : "Total: $sum rub." Après l'ajout de la variable $rub dans le code, la ligne est devenue "Total: $sum$rub", ce qui a conduit à l'interpolation ne fonctionnant que pour $sum$, tandis que $rub a été ignoré, et des avertissements ont été générés. Personne n'a compris jusqu'à ce qu'on voit une chaîne vide en sortie.
Histoire 2
Lors de la formation d'une requête SQL, l'interpolation du tableau via @values était utilisée sans jointure :
"IN (@values)". Cela entraînait une chaîne avec un espace comme séparateur au lieu de la liste attendue par des virgules. En conséquence — une erreur dans SQL et une sélection incorrecte.
Histoire 3
Pour imprimer la liste des clés d'un hachage, on utilisait %h dans la chaîne : "Keys: %h". Cela produisait une chaîne collée clé-valeur, au lieu d'une bonne liste de clés. Il aurait fallu faire :
join ", ", keys %h.