ПрограммированиеPerl разработчик

Расскажите, как в Perl происходит интерполяция массивов, хэшей и скаляров в разных типах строк, а также какие опасности связаны с этим механизмом.

Проходите собеседования с ИИ помощником Hintsage

Ответ

В Perl поддерживается интерполяция (подстановка переменных) в двойных кавычках ("") и в определённых шаблонах (например, heredoc). Скаляры интерполируются просто:

my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!

Массивы в двойных кавычках после подстановки превращаются в строку, где элементы разделены символом $" (по умолчанию — пробел):

my @items = ('a','b','c'); print "List: @items "; # List: a b c

Хэши подставляются как строка ключ=>значение, разделённые символом $;

my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (может отличаться)

В одинарных кавычках (' ') ничто не интерполируется — строка выводится дословно.

Также возможно применять сложные выражения для интерполяции через фигурные скобки:

print "${name}_test "; # Bob_test

Опасность — случайная интерполяция спецсимволов и различие поведения массивов, хэшей и скаляров.


Вопрос с подвохом

Почему строка "Total: $total$val" иногда работает неверно?

Распространённый ответ: "Всё подставляется как есть!"

Правильный ответ:

Строка "Total: $total$val" может корректно подставить только переменную $total, переменная $val может быть не распознана или Perl может интерполировать неверный диапазон, если имена переменных схожи. Чтобы избежать неоднозначности, применяйте фигурные скобки:

print "Total: ${total}${val} ";

История


История 1

В отчётах строка суммы выглядела так: "Итого: $sum руб.". После добавления переменной $rub в код строка стала "Итого: $sum$rub", в результате чего интерполяция сработала только для $sum$, а $rub пропустилась, посыпались варнинги. Никто не понял, пока не увидели пустую строку на выводе.


История 2

При формировании SQL-запроса интерполяция массива через @values использовалась без join: "IN (@values)". Это приводило к строке с пробелом-разделителем вместо ожидаемого списка через запятую. Итог — ошибка в SQL и некорректная выборка.


История 3

Для вывода списка ключей хэша использовали %h в строке: "Keys: %h". При этом получалась слепленная строка ключ-значение, вместо хорошего списка ключей. Следовало делать: join ", ", keys %h.