вторник, 27 мая 2008 г.

Один нюанс использования 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://kiev.pm.org/node/182