Пожалуйста, помогите мне понять фрагмент из книги Programming Perl

Я читал "Programming Perl" Тома Кристиансена, Брайана Д. Фоя, Ларри Уолла, Джона Орванта. Вот следующий текст, который я не понял (непонятные места выделены жирным шрифтом):

Что вам действительно нужно знать, так это то, какие операторы предоставляют какой контекст своим операндам. Как это бывает, вы можете легко сказать, какие из них предоставляют контекст списка, потому что все они имеют LIST в своих синтаксических описаниях. Все остальное обеспечивает скалярный контекст. В общем, все интуитивно понятно. При необходимости вы можете привязать скалярный контекст к аргументу в середине списка, используя псевдофункцию scalar. Perl не дает возможности принудительно привязать контекст списка к контексту, потому что везде, где вам может понадобиться контекст списка, он уже предоставлен СПИСКОМ какой-либо управляющей функции.

Для удобства я хотел бы сформулировать следующие вопросы:

  1. Что означает СПИСОК во фрагменте?

  2. Что такое синтаксическое описание? (похоже, это какая-то документация)

  3. Что означает следующий текст:

вы можете привязать скалярный контекст к аргументу в середине СПИСКА


person Dmitry Koroliov    schedule 12.07.2012    source источник


Ответы (1)


Это довольно просто, как говорится в тексте. Взгляните, например, на perldoc -f print:

print FILEHANDLE LIST
print FILEHANDLE
print LIST

Как сказано прямо здесь, print принимает аргументы LIST, что означает, что все, что публикуется после print, находится в контексте списка. То же самое для любой функции, где аргументы обозначены как LIST.

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

my $line = <$fh>;

Вычисляется в скалярном контексте, поскольку $line является скаляром. Это означает, что считывается и помещается в переменную только одна строка. Однако, если бы вы сделали:

print <$fh>;

Строка чтения находится в контексте списка, что означает, что будут прочитаны все оставшиеся строки в файле. Вы можете переопределить это, поместив оператор readline в скалярный контекст:

print scalar <$fh>;

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

print @list, scalar <$fh>, @list2;

О чем, по-видимому, и говорится в этой вашей цитате.

person TLP    schedule 12.07.2012