在Perl中使用map或grep

时间:2011-04-07 01:13:29

标签: perl

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

在使用map或grep比使用foreach / for循环带来显着优势,除了保存一行或两行代码之外,是否有任何情况?

谢谢你的时间!

2 个答案:

答案 0 :(得分:40)

Schwartzian Transform就是一个例子:

@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] }
          map  { [$_, foo($_)] }
          @unsorted;

你可以用一堆foreach循环来做到这一点,但是你必须将它们分开以找出发生了什么;一旦你看过Schwartzian变换,你就会立即认出这个习语。

一般来说,我认为mapgrep很好,因为它们可以让您在没有语法层的情况下清晰而紧凑地表示您的意图。如果您看到map,那么您就知道正在进行某种简单的数据结构转换;如果您看到grep,那么您就知道正在进行一些过滤/选择。您可以使用foreach完成所有操作,但代码的意图不像mapgrep那样清晰;如果你愿意的话,你甚至可以使用ifgoto来完成所有操作,但是你的意图将被埋没在更多的语法和状态跟踪之下。

答案 1 :(得分:16)

我一直在使用mapgrep。来自List::MoreUtilsapplyfirstany以及其他许多人。我发现,一般来说,他们会解释代码正在做什么,而 代码是如何做的。

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

例如,如果我的规范说如果foo()在某个列表中,我会$blah,我的代码就是这样写的:

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

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