Perl supporte deux formes de littéraux de chaîne - guillemets doubles (“) et guillemets simples (’). Dans les chaînes entre guillemets doubles, l'interpolation se produit : les variables et les caractères spéciaux comme , \t sont remplacés par leurs valeurs. Dans les guillemets simples, il n'y a pas d'interpolation - le contenu est pris au pied de la lettre.
Exemple :
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # L'interpolation d'expressions est possible via des accolades : my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} à l'intérieur d'une chaîne avec interpolation - c'est un moyen sûr d'insérer le résultat d'une expression dans une chaîne.Dans quels cas les variables à l'intérieur d'une chaîne entre guillemets doubles ne seront-elles pas interpolées ?
Réponse : Lorsque la variable est échappée (\$var), à l'intérieur de guillemets simples, ou si la syntaxe avec des accolades est utilisée, mais pas à bon escient, ou que le nom de la variable n'est pas limité par des accolades et qu'il se produit une "collation" du nom de la variable avec des lettres.
my $world = 'earth'; print "Hello, $worlds! "; # ERREUR : La variable $worlds n'existe pas, et non $world + lettre s
Histoire
Dans un grand projet de journalisation, des chaînes avec des variables étaient utilisées :
my $file = '/tmp/data'; print LOG 'File: $file
';
Ils s'attendaient à voir le chemin du fichier, mais le texte littéral `$file` était enregistré dans le journal, car des guillemets simples étaient utilisés. Le problème a été remarqué après le lancement en production.
Histoire
Un développeur a inséré une variable à l'intérieur d'une chaîne sans accolades :
my $user = "bob"; print "User: $user21
";
Ils s'attendaient à ce que `bob21` soit affiché, mais l'interpréteur a commencé à chercher la variable `$user21` (qui n'existait pas). Cela a entraîné l'apparition d'une valeur vide dans les rapports.
Histoire
Pour afficher le résultat d'une expression à l'intérieur d'une chaîne, le code suivant était utilisé :
my $a = 3; print "Sum: $a+5
"; # S'attendait à : 'Sum: 8', reçu : 'Sum: 3+5'
En effet, l'interpolation ne prend en compte que les variables, les expressions sont insérées littéralement. Il faut travailler via @{[ ... ]}.