Вопрос 1: блоки карты являются контекстом списка выполнения, и поэтому им разрешено возвращать ноль, одно или несколько значений. map
возвращает их всех. «,
» или «=>
» возвращают их правую сторону в скалярном контексте, но обе стороны в контексте списка. Подробнее см. perlop .
Вопрос 2: %hash = map ($_ => 1), @array
интерпретируется как %hash = (map($_, 1), @array)
. Другими словами, он возвращает (1, @array).
В %hash = map +($_ => 1), @array
знак + указывает, что () не относится к списку аргументов, поэтому он интерпретируется как map (+ ($ _ => 1), @array);
Урок дня: всегда используйте похвалы вокруг выражения вашей карты, чтобы вас не укусили подобные проблемы.