使用带有自定义函数的 Perl 映射

发布于 2024-11-30 00:05:21 字数 427 浏览 0 评论 0原文

我有一个 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 或空字符串。我做错了什么?有一个很好的惯用方法来做到这一点吗? (按顺序进行显然是微不足道的。)

I have a Perl script that has (skipping many irrelevant lines)

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

which runs without error. But when I try to access the values in the array, I get errors:

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

If I remove the mapping the code works properly -- that is, the variables are not null or empty strings. What am I doing wrong? Is there a good idiomatic way to do this? (It's obviously trivial to do sequentially.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

说不完的你爱 2024-12-07 00:05:21

encode_entities 函数默认不使用 $_,因此您需要向其传递一个参数。将 map 语句更改为以下内容即可:

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

The encode_entities function does not use $_ by default, so you need to pass it an argument. Changing your map statement to the following will work:

my @encodedKeys = map {encode_entities $_} @keys
↙厌世 2024-12-07 00:05:21

为了使代码按照问题中发布的方式正常工作,需要对 encode_entities 进行原型设计。快速浏览一下源代码事实证明事实并非如此。

正确的调用方法是:

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

For the code to work correctly as posted in the question, encode_entities needs to be prototyped. A quick glance at the source code shows that this isn't the case.

The correct way to call it is:

my @encodedKeys = map { encode_entities( $_ ) } @keys;
淡莣 2024-12-07 00:05:21

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

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

否则,foreach 更适合该任务:

encode_entities($_) for @keys;

Since encode_entities replaces HTML entities in-place, you may want to use map on a copy of @keys:

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

Otherwise, foreach is better suited for the task:

encode_entities($_) for @keys;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文