Использование карты Perl с пользовательскими функциями

У меня есть Perl-скрипт, в котором (пропущено много ненужных строк)

use HTML::Entities;
my @keys = ('ID', 'first', 'last'); # data is not actually constant
my @encodedKeys = map(encode_entities, @keys);

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

Use of uninitialized value $encodedKeys[0] in join or string at myfile.pl line 48.

Если я удаляю сопоставление, код работает правильно, то есть переменные не являются нулевыми или пустыми строками. Что я делаю неправильно? Есть ли хороший идиоматический способ сделать это? (Очевидно, что это тривиально делать последовательно.)


person Charles    schedule 15.08.2011    source источник


Ответы (3)


Чтобы код работал правильно, как указано в вопросе, encode_entities необходимо создать прототип. Беглый взгляд на исходный код показывает, что это не так.

Правильный способ назвать это:

my @encodedKeys = map { encode_entities( $_ ) } @keys;
person Zaid    schedule 15.08.2011

Функция encode_entities по умолчанию не использует $_, поэтому вам нужно передать ей аргумент. Изменение вашего оператора map на следующее будет работать:

my @encodedKeys = map {encode_entities $_} @keys
person Eric Strom    schedule 15.08.2011

Поскольку encode_entities заменяет объекты HTML на месте, вы можете использовать map в копии @keys:

 my @encodedKeys = map encode_entities($_), @{[ @keys ]};

В остальном для задачи лучше подходит foreach:

encode_entities($_) for @keys;
person Eugene Yarmash    schedule 15.08.2011