代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

在Perl中,在void上下文中使用map而不是foreach循环是否合适?

  •  12
  • Ryan C. Thompson  · 技术社区  · 14 年前

    在Perl中,如果有这样的循环:

    foreach (@items) {
        perform_action($_);
    }
    

    你可以打电话给 map 在无效上下文中:

    map {
        perform_action($_)
    } @items;
    

    这样做有什么好处或坏处吗?因为Perl认为它必须保存结果,所以它对性能有影响吗?它是否提高/恶化可读性?

    3 回复  |  直到 14 年前
        1
  •  17
  •   Jonathan Leffler    14 年前

    从Perl开始 5.8.1 在void上下文中映射并不昂贵:

    空上下文中的映射不再是 很贵。地图现在是上下文感知的, 如果 在无效上下文中调用。

    但是后缀形式 for 可能更具可读性:

    perform_action($_) for @items;
    
        2
  •  14
  •   tchrist    14 年前

    使用的问题 map grep 在虚无的语境中主要是概念性的。两者都是构造,其任务是返回一个列表。放弃这个列表会导致代码混乱,对listops的概念不清楚。我自己从来没有在虚无的环境中使用过这两种方法。

    我对三元条件运算符也有同样的感觉。它的工作是返回一个值,因此在空的上下文中使用它毫无意义,只会使人们感到困惑。

    也就是说,我不会 大量库存 Perl::Critic 甚至是PBP。我认为这本书比它不存在更好,但人们常常误解了整个论点,最后把它当作棍棒。

        3
  •  4
  •   Jonathan Leffler    14 年前

    我相信“Perl最佳实践”会建议在 foreach 循环是最好的风格-这肯定是我会使用的。

    foreach my $item (@items)
    {
        perform_action($item);
    }
    

    这是滥用 map (或 grep )在空上下文中使用它。