Один нюанс использования map

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

Примеры.

Простой блок - perl понимает сам, что имеет дело с анонимным хешем:

 > perl -MData::Dumper -e 'print Dumper [map { { 1 .. 4 } } (1 .. 2)]'
 $VAR1 = [
           {
             '1' => 2,
             '3' => 4
           },
           {
             '1' => 2,
             '3' => 4
           }
         ];

Сложный блок - perl думает, что имеет дело с лексической областью видимости:
 > perl -MData::Dumper -e 'print Dumper [map { 1; { 1 .. 4 } } (1 .. 2)]'
 $VAR1 = [
           1,
           2,
           3,
           4,
           1,
           2,
           3,
           4
         ];

Подсказка про анонимный хеш при помощи круглых скобок:
 > perl -MData::Dumper -e 'print Dumper [map { 1; ({ 1 .. 4 }) } (1 .. 2)]'
 $VAR1 = [
           {
             '1' => 2,
             '3' => 4
           },
           {
             '1' => 2,
             '3' => 4
           }
         ];

Кстати, когда анонимный хеш возвращается из обычной подпрограммы при помощи return, то нет нужды в подсказке в виде круглых скобок, так как return устраняет вышеописанную неопределенность. А вот если return отсутствует и подпрограмма возвращает последние вычисленное значение, то подсказка необходима. В блоке map return использовать нельзя.

http://laziness-impatience-hubris.blogspot.com/2008/05/map.html

unary "+"

% perl -MData::Dumper -e 'print Dumper [map { 1; +{ 1 .. 4 } } (1 .. 2)]'

Спасибо. Об

Спасибо. Об этом способе и не знал.