ProgrammationDéveloppeur Perl

Parlez-nous de la façon dont Perl fait l'interpolation des tableaux, des hachages et des scalaires dans différents types de chaînes, ainsi que des dangers associés à ce mécanisme.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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.


Question piégée

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.