W Perlu obsługiwana jest interpolacja (podstawianie zmiennych) w podwójnych cudzysłowach ("") oraz w określonych szablonach (np. heredoc). Skalary interpolują się po prostu:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
Tablice w podwójnych cudzysłowach po podstawieniu zamieniają się w ciąg, w którym elementy są oddzielone symbolem $" (domyślnie jest to spacja):
my @items = ('a','b','c'); print "List: @items "; # List: a b c
Hashe są podstawiane jako ciąg klucz=>wartość, oddzielone symbolem $;
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (może się różnić)
W pojedynczych cudzysłowach (' ') nic nie jest interpolowane — ciąg wyświetlany jest dosłownie.
Możliwe jest również stosowanie złożonych wyrażeń do interpolacji przez nawiasy klamrowe:
print "${name}_test "; # Bob_test
Niebezpieczeństwo — przypadkowa interpolacja specjalnych symboli oraz różnice w zachowaniu tablic, hashy i skalara.
Dlaczego ciąg "Total: $total$val" czasami działa niepoprawnie?
Powszechnie znana odpowiedź: "Wszystko jest podstawiane jak jest!"
Poprawna odpowiedź:
Ciąg "Total: $total$val" może poprawnie podstawiać tylko zmienną $total, zmienna $val może nie być rozpoznana lub Perl może interpolować niewłaściwy zakres, jeśli nazwy zmiennych są podobne. Aby uniknąć niejednoznaczności, należy stosować nawiasy klamrowe:
print "Total: ${total}${val} ";
Historia
Historia 1
W raportach ciąg sumy wyglądał tak: "Ilość: $sum rub.". Po dodaniu zmiennej $rub w kodzie, ciąg stał się "Ilość: $sum$rub", w rezultacie czego interpolacja zadziałała tylko dla $sum$, a $rub została pominięta, pojawiły się ostrzeżenia. Nikt nie zrozumiał, aż nie zobaczyli pustego ciągu na wyjściu.
Historia 2
Przy formułowaniu zapytania SQL, interpolacja tablicy przez @values była używana bez join:
"IN (@values)". To prowadziło do ciągu z separatorem spacji zamiast oczekiwanego listy przez przecinek. W efekcie — błąd w SQL i niepoprawny wybór.
Historia 3
Do wyświetlania listy kluczy hashy użyto %h w ciągu: "Keys: %h". W rezultacie powstawał zmieszany ciąg klucz-wartość, zamiast ładnej listy kluczy. Należało zrobić:
join ", ", keys %h.