В 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.