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

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

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

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

  1. Что значит LIST во фрагменте?

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

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

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

1 ответ

Решение

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

print FILEHANDLE LIST
print FILEHANDLE
print LIST

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

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

my $line = <$fh>;

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

print <$fh>;

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

print scalar <$fh>;

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

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

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

Другие вопросы по тегам