Использование выражений, создающих списки, в скалярном контексте

Многие выражения обычно используются для создания списков. Что вы получите, используя такое выражение в скалярном контексте? Посмотрите, что скажет автор этой операции. Обычно автором является Ларри, а все сведения приводятся в документации. В сущности, изучение того, как Ларри думает2, является важной частью изучения Perl. Научившись думать так, как думает Ларри, вы будете знать, что сделает Perl в той или иной ситуации. А пока будете учиться, вам, вероятно, придется заглядывать в документацию. Некоторые выражения вообще не имеют значения в скалярном контексте.

Например, что должен возвращать вызов sort в скалярном контексте? Для подсчета количества элементов сортировка списка не нужна, поэтому до тех пор пока ктоQнибудь не создаст новую реализацию, sort в скалярном контексте всегда возвращает undef. Или другой пример: оператор reverse. В списочном контексте он возвращает обращенный список. В скалярном контексте возвращается обращенная строка (или обращенный результат конкатенации всех строк списка, если он задан):

@backwards = reverse qw/ yabba dabba doo /;
# Получаем doo, dabba, yabba
$backwards = reverse qw/ yabba dabba doo /;
# Получаем oodabbadabbay

На первый взгляд не всегда можно сразу сказать, используется ли выражение в скалярном или списочном контексте.


Но поверьте, со временем это станет вашей второй натурой. Несколько типичных примеров контекста:

$fred = нечто; # Скалярный контекст
@pebbles = нечто; # Списочный контекст
($wilma, $betty) = нечто; # Списочный контекст
($dino) = нечто; # И в этом случае списочный контекст!

Не ошибитесь со списком из одного элемента: он все равно имеет списочный, а не скалярный контекст. Круглые скобки здесь принципиальны; с ними четвертая строка отличается от первой. Если значение присваивается списку (независимо от количества элементов), всегда используется списочный контекст. Присваивание массиву также выполняется в списочном контексте. Несколько уже знакомых выражений с указанием контекста. Для начала несколько выражений, в которых нечто имеет скалярный контекст:

$fred = нечто;
$fred[3] = нечто;
123 + нечто
нечто + 654
if (нечто) { ... }
while (нечто) { ... }
$fred[нечто] = нечто;

Несколько выражений со списочным контекстом:
@fred = нечто;
($fred, $barney) = нечто;
($fred) = нечто;
push @fred, нечто;
foreach $fred (нечто) { ... }
sort нечто
reverse нечто
print нечто

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

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

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