Массивы, как и скаляры, могут интерполироваться в строках, заключенных в кавычки. Элементы массивов при интерполяции автоматически разделяются пробелами:
@rocks = qw{ flintstone slate rubble };
print "quartz @rocks limestone\n"; # печатает пять слов,
# разделенных пробелами
Перед интерполируемым массивом и после него дополнительные пробелы не вставляются; если они вам нужны, вставьте их самостоятельно:
print "Three rocks are: @rocks.\n";
print "There's nothing in the parens (@empty) here.\n";
Если вы забудете, что массивы интерполируются подобным образом, при вставке адреса электронной почты в строку в кавычках вас может ждать сюрприз:
$email = "fred@bedrock.edu"; # ОШИБКА! Попытка интерполяции @bedrock
Хотя строка содержит обычный адрес электронной почты, Perl обнаруживает массив @bedrock и пытается интерполировать его. В некоторых версиях Perl выдается предупреждение:
Possible unintended interpolation of @bedrock
Проблема решается либо экранированием @ в строке в кавычках, либо использованием строки в апострофах:
$email = "fred\@bedrock.edu"; # Правильно
$email = 'fred@bedrock.edu'; # Другой способ с тем же результатом
Один элемент массива при интерполяции заменяется своим текущим значением, как и следовало ожидать:
@fred = qw(hello dolly);
$y = 2;
$x = "This is $fred's place"; # "This is dolly's place"
$x = "This is $fred[$y1]'s place"; # То же самое
Индексное выражение вычисляется по правилам обычных выражений, как если бы оно находилось вне строки. Предварительная интерполяция переменных не выполняется. Иначе говоря, если $y содержит строку "2*4", то интерполироваться будет элемент 1, а не элемент 7, потому что "2*4" в числовом контексте (значение $y, используемое в числовом выражении) преобразуется в 2.1 Если за простой скалярной переменной должна выводиться левая квадратная скобка, отделите ее, чтобы она не считалась частью ссылки на массив:
@fred = qw(eating rocks is wrong);
$fred = "right"; # Мы пытаемся вывести "this is right"
print "this is $fred\n"; # Выводит "wrong" изза $fred
print "this is ${fred}\n"; # Выводит "right" (защита в виде
# фигурных скобок)
print "this is $fred"."\n"; # Снова "right" (другая строка)
print "this is $fred\\n"; # Снова "right" (экранирование обратной
# косой чертой)