Скалярный и списочный контекст

Мы подошли к самому важному разделу этой главы. Более того, это самый важный раздел во всей книге. Можно без преувеличения сказать, что от того, насколько хорошо вы поймете этот раздел, будет зависеть вся ваша карьера программиста Perl. Если до этого момента вы бегло просматривали текст, здесь пора переходить к внимательному чтению. Но это вовсе не означает, что материал этого раздела сложен для понимания. Основная идея проста: смысл любого выражения зависит от того, где оно используется. В этом нет ничего принципиально нового; в естественных языках контекст используется сплошь и рядом. Допустим, ктоQто спросил вас, что означает слово «узел». Однако это слово может иметь разный смысл в зависимости от того, где оно используется. Невозможно определить смысл, не зная контекста.

В ходе разбора выражений Perl всегда ожидает встретить либо скалярное, либо списочное значение.1 Разновидность значения, которую ожидает встретить Perl, называется контекстом выражения.

42 + нечто # нечто должно быть скаляром
sort нечто # нечто должно быть списком

Одна последовательность символов может интерпретироваться как скалярное значение в одном контексте и как списочное – в другом.


Выражения Perl всегда возвращают значение, соответствующее их контексту. Для примера возьмем «имя»4 массива. В списочном контексте оно рассматривается как список элементов, а в скалярном – как количество элементов в массиве:

@people = qw( fred barney betty );
@sorted = sort @people; # Списочный контекст: barney, betty, fred
$number = 42 + @people; # Скалярный контекст: 42 + 3 = 45

Даже обычное присваивание (скалярной переменной или списку) работает в разных контекстах:

@list = @people; # Список из трех элементов
$n = @people; # Число 3

Но, пожалуйста, не торопитесь с выводом, что скалярный контекст всегда дает количество элементов, которые были бы возвращены в списочном контексте. Большинство выражений, создающих списки1, возвращают намного более интересную информацию.

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

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

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