programowanieBackend Perl developer

Jakie są sposoby interpolacji zmiennych i wyrażeń w łańcuchach Perl oraz co należy wziąć pod uwagę przy ich użyciu?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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

Szczegóły i subtelności:

  • Nie zapominaj o escapowaniu zmiennych, gdy po nich następują litery, w przeciwnym razie Perl będzie myślał, że to część nazwy zmiennej.
  • Dla złożonych wyrażeń używaj @{[ ... ]} wewnątrz łańcucha z interpolacją – to bezpieczny sposób na wstawienie wyniku wyrażenia do łańcucha.

Pytanie z haczykiem

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

Przykłady rzeczywistych błędów z powodu nieznajomości subtelności tematu


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ć @{[ ... ]}.