In Perl is er ondersteuning voor interpolatie (variabele substitutie) in dubbele aanhalingstekens ("") en in bepaalde sjablonen (bijvoorbeeld, heredoc). Scalars worden eenvoudig geïnterpoleerd:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Arrays in dubbele aanhalingstekens worden na substitutie omgezet in een string waarin de elementen gescheiden zijn door het teken $" (standaard is dit een spatie):
my @items = ('a','b','c'); print "Lijst: @items "; # Lijst: a b c
Hashes worden als een string van sleutel=>waarde, gescheiden door het teken $; geïnterpoleerd:
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (kan verschillen)
In enkele aanhalingstekens (' ') wordt er niets geïnterpoleerd — de string wordt letterlijk weergegeven.
Het is ook mogelijk om complexe expressies voor interpolatie te gebruiken door accolades:
print "${name}_test "; # Bob_test
Het gevaar — onbedoelde interpolatie van speciale tekens en verschillende gedragingen van arrays, hashes en scalars.
Waarom werkt de string "Totaal: $total$val" soms niet correct?
Een veelgehoord antwoord: "Alles wordt als is substitueert!"
Correct antwoord:
De string "Totaal: $total$val" kan alleen de variabele $total correct substitueren; de variabele $val kan niet worden herkend of Perl kan een onjuiste range interpoleren als de namen van de variabelen vergelijkbaar zijn. Om ambiguïteit te vermijden, gebruik accolades:
print "Totaal: ${total}${val} ";
Geschiedenis
Geschiedenis 1
In de rapporten zag de somstring eruit als: "Totaal: $sum roebel." Na het toevoegen van de variabele $rub in de code werd de string "Totaal: $sum$rub", waardoor de interpolatie alleen werkte voor $sum$, terwijl $rub werd overgeslagen, wat leidde tot waarschuwingen. Niemand begreep het totdat ze de lege string op de uitvoer zagen.
Geschiedenis 2
Bij het vormen van een SQL-query werd de interpolatie van de array via @values gebruikt zonder join:
"IN (@values)". Dit leidde tot een string met een spatie als scheidingsteken in plaats van de verwachte lijst door komma's. Eindresultaat — een fout in SQL en een onjuiste selectie.
Geschiedenis 3
Voor het weergeven van de lijst met sleutels van de hash werd %h in de string gebruikt: "Sleutels: %h". Dit resulteerde in een samengevoegde string van sleutel-waarde in plaats van een goede lijst van sleutels. Het had moeten zijn:
join ", ", keys %h.