【问题标题】:Using Perl's map with custom functions将 Perl 的映射与自定义函数一起使用
【发布时间】:2012-01-22 15:35:58
【问题描述】:

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

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

【问题讨论】:

    标签: perl higher-order-functions


    【解决方案1】:

    encode_entities 函数默认不使用$_,所以你需要传递一个参数。将您的 map 语句更改为以下内容将起作用:

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

    【讨论】:

      【解决方案2】:

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

      正确的称呼是:

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

      【讨论】:

        【解决方案3】:

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

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

        否则,foreach 更适合该任务:

        encode_entities($_) for @keys;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-11
          • 1970-01-01
          • 1970-01-01
          • 2018-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          相关资源
          最近更新 更多