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

Rya*_*son 12 perl foreach map

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

foreach (@items) {
    perform_action($_);
}
Run Code Online (Sandbox Code Playgroud)

您可以通过调用mapvoid上下文来替换它:

map {
    perform_action($_)
} @items;
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*ash 17

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

在void上下文中的map不再昂贵.map现在可以识别上下文,如果在void上下文中调用,则不会构造列表.

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

perform_action($_) for @items;
Run Code Online (Sandbox Code Playgroud)

  • 虽然map语句本身可能知道它的上下文,但程序员可能不会.从诸如`sub foo {map {...} @_}之类的构造中,要告诉实际会发生什么并且如果你泄漏了部分实现并且你想要做的就是将地图滥用为地图并不容易定期的. (12认同)
  • perldoc还说foreach循环更清晰然后map:"注意$ _是列表值的别名,所以它可以用来修改LIST的元素.虽然这很有用并且支持,但是如果它有用,它会导致奇怪的结果LIST的元素不是变量.在大多数情况下,为此目的使用常规的foreach循环会更清晰." (2认同)

tch*_*ist 14

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

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

也就是说,我不会把太多的股票投入到Perl::CriticPBP中.我想这本书的存在比它不存在更好,但是人们经常误解整个观点并最终将其用作大棒.