[英]In Perl, is it appropriate to use map in void context instead of a foreach loop?
在Perl中,如果你有这样的循环:
foreach (@items) {
perform_action($_);
}
您可以在void上下文中调用map
来替换它:
map {
perform_action($_)
} @items;
这样做有什么优点或缺点? 它是否会对性能产生影响,因为Perl认为必须保存结果? 它是否会改善/恶化可读性?
从void上下文中的Perl 5.8.1映射开始并不昂贵:
在void上下文中的map不再昂贵。 map现在可以识别上下文,如果在void上下文中调用,则不会构造列表。
但for
的postfix形式可能更具可读性:
perform_action($_) for @items;
在void上下文中使用map
或grep
的问题主要是概念性的。 两者都是构造,其作用是返回列表。 丢弃该列表会导致混乱的代码,不清楚listops的概念。 我自己从不使用虚空语境中的任何一个。
我对三元条件运算符有同样的看法。 它的工作是返回一个值,因此在void上下文中使用它是没有意义的,只会让人感到困惑。
也就是说,我不会在Perl::Critic
甚至是PBP中投入过多的股票。 我想这本书的存在比它不存在更好,但是人们经常误解整个观点并最终将其用作大棒。
我相信'Perl Best Practices'会建议在foreach
循环中使用显式变量作为最佳样式 - 这当然是我使用的。
foreach my $item (@items)
{
perform_action($item);
}
滥用map
(或grep
)是在void上下文中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.