Использование карты Perl с пользовательскими функциями - PullRequest
3 голосов
/ 16 августа 2011

У меня есть скрипт на 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.

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

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

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

my @encodedKeys = map {encode_entities $_} @keys
3 голосов
/ 16 августа 2011

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

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

my @encodedKeys = map { encode_entities( $_ ) } @keys;
1 голос
/ 16 августа 2011

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

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

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

encode_entities($_) for @keys;
...