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

时间:2010-11-13 20:20:04

标签: perl map foreach

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

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

您可以在void上下文中调用map来替换它:

map {
    perform_action($_)
} @items;

做到有什么优点或缺点吗?它是否会对性能产生影响,因为Perl认为必须保存结果?它是否会改善/恶化可读性?

3 个答案:

答案 0 :(得分:17)

从void上下文中的Perl 5.8.1 map开始并不昂贵:

  

不再使用void上下文中的map   昂贵。 map现在可以识别上下文,   并且如果是,则不会构建列表   在虚拟背景中调用。

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

perform_action($_) for @items;

答案 1 :(得分:14)

在void上下文中使用mapgrep的问题主要是概念性的。两者都是构造,其作用是返回列表。丢弃该列表会导致混乱的代码,不清楚listops的概念。我自己从不使用虚空语境中的任何一个。

我对三元条件运算符有同样的看法。它的工作是返回一个值,所以在void上下文中使用它是没有意义的,只会让人感到困惑。

那就是说,我不会将太多多的股票投入Perl::Critic甚至PBP。我觉得这本书的存在比不存在更好,但是人们经常误解整个观点并最终将其用作大棒。

答案 2 :(得分:4)

我相信'Perl最佳实践'会建议在foreach循环中使用显式变量作为​​最佳样式 - 这肯定是我使用的。

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

滥用map(或grep)是在虚拟环境中使用它。