In Perl viene supportata l'interpolazione (sostituzione delle variabili) tra virgolette doppie ("") e in determinati modelli (ad esempio, heredoc). Gli scalari vengono interpolati semplicemente:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Gli array tra virgolette doppie vengono convertiti in una stringa, dove gli elementi sono separati dal carattere $" (di default è uno spazio):
my @items = ('a','b','c'); print "List: @items "; # List: a b c
Gli hash vengono sostituiti come stringa chiave=>valore, separati dal carattere $;
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (potrebbe variare)
Tra virgolette singole (' ') niente viene interpolato — la stringa viene stampata letteralmente.
È anche possibile applicare espressioni complesse per l'interpolazione tramite parentesi graffe:
print "${name}_test "; # Bob_test
Il pericolo — l'interpolazione accidentale di caratteri speciali e la differenza nel comportamento di array, hash e scalari.
Perché la stringa "Total: $total$val" a volte non funziona correttamente?
Risposta comune: "Tutto viene sostituito così com'è!"
Risposta corretta:
La stringa "Total: $total$val" può sostituire correttamente solo la variabile $total, la variabile $val potrebbe non essere riconosciuta oppure Perl potrebbe interpolare un intervallo errato, se i nomi delle variabili sono simili. Per evitare ambiguità, utilizzare le parentesi graffe:
print "Total: ${total}${val} ";
Storia
Storia 1
Nei report, la stringa del totale appariva così: "Totale: $sum rub.". Dopo l'aggiunta della variabile $rub nel codice, la stringa divenne "Totale: $sum$rub", il che portò all'interpolazione solo per $sum$, mentre $rub venne saltata, scatenando avvisi. Nessuno capì fino a quando non videro una stringa vuota nell'output.
Storia 2
Nella creazione di una query SQL, l'interpolazione dell'array attraverso @values veniva utilizzata senza join:
"IN (@values)". Questo portava a una stringa con uno spazio come delimitatore invece dell'atteso elenco separato da virgole. Risultato — errore in SQL e selezione errata.
Storia 3
Per stampare l'elenco delle chiavi di un hash si utilizzava %h nella stringa: "Keys: %h". Così otteneva una stringa unita chiave-valore, invece di un buon elenco di chiavi. Si doveva fare:
join ", ", keys %h.