Интерполяция массивов в строках

Массивы, как и скаляры, могут интерполироваться в строках, заключенных в кавычки. Элементы массивов при интерполяции автоматически разделяются пробелами:

@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[1]'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[3]"
print "this is $fred[3]\n"; # Выводит "wrong" изза $fred[3]
print "this is ${fred}[3]\n"; # Выводит "right" (защита в виде
# фигурных скобок)
print "this is $fred"."[3]\n"; # Снова "right" (другая строка)
print "this is $fred\[3]\n"; # Снова "right" (экранирование обратной
# косой чертой)

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
в списочном контексте
Главная служебная переменная: $_
Использование выражений, создающих скаляры, в списочном контексте
Использование выражений, создающих списки, в скалярном контексте
Обращение к элементам массива

Вернуться в раздел: Perl / 2. Списки и массивы