Perl obsługuje dwie formy literałów łańcuchowych — podwójne (“) i pojedyncze (’ cudzysłowy). Wewnątrz łańcuchów w podwójnych cudzysłowach następuje interpolacja: zmienne i znaki specjalne, takie jak , \t, są zastępowane swoimi wartościami. W pojedynczych cudzysłowach nie ma interpolacji — zawartość jest traktowana dosłownie.
Przykład:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # Interpolacja wyrażenia jest możliwa przez nawiasy klamrowe: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} wewnątrz łańcucha z interpolacją – to bezpieczny sposób na wstawienie wyniku wyrażenia do łańcucha.W jakich przypadkach zmienne wewnątrz łańcucha w podwójnych cudzysłowach nie będą interpolowane?
Odpowiedź: Gdy zmienna jest eskapowana (\$var), wewnątrz pojedynczych cudzysłowów, albo jeśli używany jest składnik z nawiasami klamrowymi, ale niezgodnie z przeznaczeniem, albo nazwa zmiennej nie jest ograniczona nawiasami i dochodzi do "sklejenia" nazwy zmiennej z literami.
my $world = 'earth'; print "Hello, $worlds! "; # BŁĄD: Zmienna $worlds nie istnieje, a nie $world + litera s
Historia
W dużym projekcie do logowania używano łańcuchów ze zmiennymi:
my $file = '/tmp/data'; print LOG 'File: $file
';
Oczekiwano zobaczenia ścieżki do pliku, ale do logu trafiał dosłowny tekst `$file`, ponieważ używano pojedynczych cudzysłowów. Problem zauważono po uruchomieniu w produkcji.
Historia
Jeden programista wstawił zmienną do łańcucha bez nawiasów klamrowych:
my $user = "bob"; print "User: $user21
";
Oczekiwano, że wyświetli się `bob21`, ale interpreter zaczął szukać zmiennej `$user21` (której nie było). To spowodowało pojawienie się pustej wartości w raportach.
Historia
Do wyświetlenia wyniku wyrażenia w łańcuchu używano takiego kodu:
my $a = 3; print "Sum: $a+5
"; # Oczekiwano: 'Sum: 8', otrzymano: 'Sum: 3+5'
Rzeczywiście, interpolacja liczy tylko zmienne, wyrażenia są podstawiane dosłownie. Należy użyć @{[ ... ]}.