使用Perl的地图和自定义函数

时间:2011-08-15 20:51:19

标签: perl higher-order-functions

我有一个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.

如果我删除映射代码正常工作 - 也就是说,变量不是null或空字符串。我究竟做错了什么?有一个很好的惯用方法吗? (按顺序执行显然是微不足道的。)

3 个答案:

答案 0 :(得分:4)

encode_entities函数默认不使用$_,因此您需要将参数传递给它。将map语句更改为以下语句将起作用:

my @encodedKeys = map {encode_entities $_} @keys

答案 1 :(得分:3)

要使代码在问题中发布正常工作,encode_entities需要进行原型设计。快速浏览source code表明情况并非如此。

调用它的正确方法是:

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

答案 2 :(得分:1)

由于encode_entities替换HTML实体就地,您可能希望在map的副本上使用@keys

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

否则,foreach更适合完成任务:

encode_entities($_) for @keys;