map或grep在Perl中的使用

map或grep在Perl中的使用,perl,Perl,我已经全职编写了几个月的perl代码(生物信息学),并且一直在努力提高我的技能。就在今天,我突然意识到我从不使用map或grep。回顾我的代码,我意识到这些工具可以在这里或那里为我节省几行代码,但这只是以牺牲foreach循环的灵活性为代价的。我的问题如下: 除了保存一两行代码外,您是否遇到过使用map或grep比foreach/for循环带来显著优势的情况 谢谢你的时间 这将是一个例子: @sorted = map { $_->[0] } sort { $a->

我已经全职编写了几个月的perl代码(生物信息学),并且一直在努力提高我的技能。就在今天,我突然意识到我从不使用map或grep。回顾我的代码,我意识到这些工具可以在这里或那里为我节省几行代码,但这只是以牺牲foreach循环的灵活性为代价的。我的问题如下:

除了保存一两行代码外,您是否遇到过使用map或grep比foreach/for循环带来显著优势的情况

谢谢你的时间

这将是一个例子:

@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] }
          map  { [$_, foo($_)] }
          @unsorted;
你可以用一堆
foreach
循环来实现这一点,但你必须把它们分开来找出到底发生了什么;一旦你看到了施瓦茨变换,你马上就能认出这个成语


总的来说,我认为
map
grep
很好,因为它们可以让你清晰、简洁地表达你的意图,而不需要语法层次。如果您看到一张
地图
,那么您就知道正在进行某种简单的数据结构转换;如果您看到一个
grep
,那么您知道正在进行一些筛选/选择。您可以使用
foreach
完成这一切,但代码的意图并不像
map
grep
那样清晰;如果你愿意,你甚至可以使用
if
goto
来完成这一切,但是你的意图将被更多的语法和状态跟踪所掩盖。

我一直在使用
map
grep
。和
应用
首先
任何
,以及其他许多来自。我发现,一般来说,它们解释了代码在做什么,而不是代码是如何做的

一般来说,我发现当我的代码读取与规范相同的内容时,它更有可能是正确的,也更有可能处理角/边情况。Perl允许我比过去使用的任何语言都做得更好,我充分利用了它

例如,如果我的规范说如果
$blah
在某个列表中,我将执行
foo()

foo() if any { $_ eq $blah } some_list();

其他这些工具也有同样的想法。代码和规范看起来非常相似,这是Perl的一大优点。

感谢您简洁地回答我的问题。将来我肯定会使用Schwartzian传输,直到现在我都不得不解决这些类型的问题。@wespiserA:请注意Tanktalus在
列表::MoreUtils
,该软件包提供了一些很好的工具,可以让您的代码符合您的意图。+1用于第二段。Perl有很多在技术上可以互换的命令,所以选择一个语义最清楚地向将来阅读您的代码的人传达您的意图的命令:映射可以与较大的表达式内联。一个外国人不能。