在Perl中,如果你有这样的循环:
foreach (@items) {
perform_action($_);
}
您可以在void上下文中调用map
来替换它:
map {
perform_action($_)
} @items;
做到有什么优点或缺点吗?它是否会对性能产生影响,因为Perl认为必须保存结果?它是否会改善/恶化可读性?
答案 0 :(得分:17)
从void上下文中的Perl 5.8.1 map开始并不昂贵:
不再使用void上下文中的map 昂贵。 map现在可以识别上下文, 并且如果是,则不会构建列表 在虚拟背景中调用。
但for
的后缀形式可能更具可读性:
perform_action($_) for @items;
答案 1 :(得分:14)
在void上下文中使用map
或grep
的问题主要是概念性的。两者都是构造,其作用是返回列表。丢弃该列表会导致混乱的代码,不清楚listops的概念。我自己从不使用虚空语境中的任何一个。
我对三元条件运算符有同样的看法。它的工作是返回一个值,所以在void上下文中使用它是没有意义的,只会让人感到困惑。
那就是说,我不会将太多多的股票投入Perl::Critic
甚至PBP。我觉得这本书的存在比不存在更好,但是人们经常误解整个观点并最终将其用作大棒。
答案 2 :(得分:4)
我相信'Perl最佳实践'会建议在foreach
循环中使用显式变量作为最佳样式 - 这肯定是我使用的。
foreach my $item (@items)
{
perform_action($item);
}
滥用map
(或grep
)是在虚拟环境中使用它。