Перл поддерживает две формы строковых литералов — двойные (“) и одинарные (’ кавычки). Внутри строк в двойных кавычках происходит интерполяция: переменные и спецсимволы вроде , \t заменяются на их значения. В одинарных кавычках интерполяции нет — содержимое воспринимается буквально.
Пример:
my $name = "Alex"; print "Hello, $name! "; # Hello, Alex! print 'Hello, $name! '; # Hello, $name! # Интерполяция выражения возможно через фигурные скобки: my $i = 10; print "i + 5 = @{[$i + 5]} "; # i + 5 = 15
@{[ ... ]} внутри строки с интерполяцией – это безопасный способ вставить результат выражения в строку.В каких случаях переменные внутри строки в двойных кавычках не будут интерполироваться?
Ответ: Когда переменная экранирована (\$var), внутри одинарных кавычек, либо если используется синтаксис с фигурными скобками, но не по назначению, либо имя переменной не ограничено скобками и происходит "склеивание" имени变量 с буквами.
my $world = 'earth'; print "Hello, $worlds! "; # ОШИБКА: Переменной $worlds нет, а не $world + буква s
История
В крупном проекте для логирования использовали строки с переменными:
my $file = '/tmp/data'; print LOG 'File: $file
';
Ожидали увидеть путь к файлу, но в лог уходил буквальный текст `$file`, т.к. использовались одинарные кавычки. Проблема заметилась после запуска в продакшене.
История
Один разработчик вставил переменную внутрь строки без фигурных скобок:
my $user = "bob"; print "User: $user21
";
Ожидалось, что выведется `bob21`, но интерпретатор стал искать переменную `$user21` (которой не было). Это вызвало появление пустого значения в отчетах.
История
Для отображения результата выражения внутри строки использовался такой код:
my $a = 3; print "Sum: $a+5
"; # Ожидалось: 'Sum: 8', получили: 'Sum: 3+5'
Действительно, интерполяция считает только переменные, выражения подставляются буквально. Работать нужно через @{[ ... ]}.