在Perl中使用map或grep

wes*_*erA 14 perl

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

你有没有遇到过使用map或grep比foreach/for循环带来显着优势的情况,除了保存一行或两行代码之外?

谢谢你的时间!

mu *_*ort 40

使用Schwartzian转换将是一个例子:

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

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

总的来说,我认为map并且grep很好,因为它们允许您在没有语法层的情况下清晰而紧凑地表示您的意图.如果你看到一个,map那么你知道正在进行某种简单的数据结构转换; 如果你看到一个,grep那么你就知道正在进行一些过滤/选择.你可以做到这一切有foreach,但你的代码的意图是不明确的,因为它会用mapgrep; 你甚至可以与所有做ifgoto,如果你想但随后你的意图会在更语法和状态跟踪被埋没.

  • @wespiserA:关注Tanktalus的'List :: MoreUtils`,该软件包提供了一些很好的工具,可以让你的代码符合你的意图. (5认同)
  • 第二段+1.Perl有很多在技术上可以互换的命令,所以选择一个语义最明确地向未来读取你的代码的人传达你的意图的命令. (4认同)

Tan*_*lus 16

我经常使用mapgrep.而且apply,first,any,和许多其他人List::MoreUtils.我发现,在一般情况下,他们解释什么代码是做,而不是如何代码是做什么的.

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

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

foo() if any { $_ eq $blah } some_list();
Run Code Online (Sandbox Code Playgroud)

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