programowanieProgramista Perl

Opowiedz, jak w Perlu zachodzi interpolacja tablic, hashy i skalara w różnych typach ciągów, a także jakie niebezpieczeństwa wiążą się z tym mechanizmem.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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.


Pytanie z podstępem

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.