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

Какие есть способы интерполяции переменных и выражений в строках Perl, и что следует учитывать при их использовании?

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

Ответ

Перл поддерживает две формы строковых литералов — двойные (“) и одинарные (’ кавычки). Внутри строк в двойных кавычках происходит интерполяция: переменные и спецсимволы вроде , \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'


Действительно, интерполяция считает только переменные, выражения подставляются буквально. Работать нужно через @{[ ... ]}.