Как «map» интерпретирует свой первый аргумент в Perl? - PullRequest
5 голосов
/ 13 января 2009

У меня есть несколько вопросов по поводу функции Perl "map".

В частности:

  • Как работает

    % hash = map {$ _ => 1} @ array

    создать элементы массива отображения хэша в 1? Как блок возвращает список из двух элементов? Я думал, блок возвращает свое последнее значение. Создает ли>> неявно список, в отличие от «», который возвращает правильный аргумент?

  • Почему

    % hash = map ($ _ => 1), @ array

    не работает? Я пытаюсь вернуть список из двух элементов здесь ... А как предваряющий "+" перед "(" исправить это, с точки зрения парсера?

Ответы [ 4 ]

9 голосов
/ 13 января 2009

Вопрос 1: блоки карты являются контекстом списка выполнения, и поэтому им разрешено возвращать ноль, одно или несколько значений. map возвращает их всех. «,» или «=>» возвращают их правую сторону в скалярном контексте, но обе стороны в контексте списка. Подробнее см. perlop .

Вопрос 2: %hash = map ($_ => 1), @array интерпретируется как %hash = (map($_, 1), @array). Другими словами, он возвращает (1, @array). В %hash = map +($_ => 1), @array знак + указывает, что () не относится к списку аргументов, поэтому он интерпретируется как map (+ ($ _ => 1), @array);

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

4 голосов
/ 13 января 2009

Добавление к @ Leon правильных ответов, чтобы помочь вам с вашим вторым вопросом:

от perlop

Унарный "+" не имеет никакого эффекта, даже на струнах. Это полезно синтаксически для отделения имени функции от скобок выражение, которое в противном случае будет интерпретировано как полный список аргументы функции.

Вы можете использовать deparse, чтобы увидеть, как perl интерпретирует каждый из них:

perl -MO=Deparse,-p -e "%h = map ($_ => 1), @a;"
(((%h) = map($_, 1)), @a);

где как

perl -MO=Deparse,-p -e "%h = map +($_ => 1), @a;"
((%h) = map(($_, 1), @a));

Надеюсь, это поможет

0 голосов
/ 13 января 2009

Карта применяет блок к каждому значению в массиве / списке и создает новый список. => является синтаксическим сахаром, показывающим, что список состоит из пар ключ / значение (IIRC, он также будет работать с обычной запятой). Когда вы присваиваете список альтернативных пар ключ / значение для хеш-переменной, создается хеш-таблица.

Другой вариант не работает, поскольку он не является блоком кода. Я не знаю о +.

0 голосов
/ 13 января 2009

Первый аргумент - это блок кода или подпрограмма. Блоки кода должны быть окружены {}. Они работают не совсем как лямбды, но чертовски близко.

Редактировать: Понятия не имею, почему добавление + после 1 работает. Возможно, он каким-то странным образом компилируется в блок кода? Это не похоже на perldoc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...