In Perl wird Interpolation (Variablenersetzung) in doppelten Anführungszeichen ("") und in bestimmten Vorlagen (z. B. heredoc) unterstützt. Skalare werden einfach interpoliert:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Arrays in doppelten Anführungszeichen werden nach der Ersetzung in eine Zeichenkette umgewandelt, in der die Elemente durch das Zeichen $" (standardmäßig ein Leerzeichen) getrennt sind:
my @items = ('a','b','c'); print "List: @items "; # List: a b c
Hashes werden als Zeichenkette von Schlüssel=>Wert, getrennt durch das Zeichen $;, eingesetzt:
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (kann abweichen)
In einfachen Anführungszeichen (' ') wird nichts interpoliert — der String wird wörtlich ausgegeben.
Es ist auch möglich, komplexe Ausdrücke zur Interpolation mit geschweiften Klammern zu verwenden:
print "${name}_test "; # Bob_test
Die Gefahr besteht in zufälliger Interpolation von Sonderzeichen und den unterschiedlichen Verhaltensweisen von Arrays, Hashes und Skalaren.
Warum funktioniert der String "Total: $total$val" manchmal nicht richtig?
Häufige Antwort: "Alles wird so eingesetzt, wie es ist!"
Richtige Antwort:
Der String "Total: $total$val" kann nur die Variable $total korrekt einsetzen, die Variable $val könnte nicht erkannt werden oder Perl könnte einen falschen Bereich interpolieren, wenn die Variablennamen ähnlich sind. Um Mehrdeutigkeiten zu vermeiden, verwenden Sie geschweifte Klammern:
print "Total: ${total}${val} ";
Geschichte
Geschichte 1
In den Berichten sah der Summenstring so aus: "Total: $sum Rubel." Nach der Hinzufügung der Variable $rub im Code wurde der String zu "Total: $sum$rub", was dazu führte, dass die Interpolation nur für $sum$ funktionierte, während $rub übersprungen wurde, und es gab Warnungen. Niemand verstand es, bis sie den leeren String in der Ausgabe sahen.
Geschichte 2
Bei der Erstellung einer SQL-Abfrage wurde die Interpolation des Arrays über @values ohne join verwendet:
"IN (@values)". Dies führte zu einem String mit einem Leerzeichen als Trennzeichen anstelle der erwarteten Liste mit Kommas. Ergebnis — ein Fehler in SQL und eine inkorrekte Auswahl.
Geschichte 3
Zur Ausgabe der Schlüssel eines Hashes wurde %h in den String verwendet: "Keys: %h". Dabei entstand ein zusammengefügter Schlüssel-Wert-String anstelle einer guten Liste von Schlüsseln. Man hätte tun sollen:
join ", ", keys %h.