我已经写了几个月的全职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
,但你的代码的意图是不明确的,因为它会用map
或grep
; 你甚至可以与所有做if
和goto
,如果你想但随后你的意图会在更语法和状态跟踪被埋没.
Tan*_*lus 16
我经常使用map
和grep
.而且apply
,first
,any
,和许多其他人List::MoreUtils
.我发现,在一般情况下,他们解释什么代码是做,而不是如何代码是做什么的.
一般来说,我发现当我的代码与规范读取相同时,它更可能是正确的,并且更有可能处理角落/边缘情况.Perl允许我比过去使用的任何语言都做得更好,并且我利用它.
例如,如果我的规范说foo()
如果$blah
在某个列表中我将会这样做,我的代码就是这样读取的:
foo() if any { $_ eq $blah } some_list();
Run Code Online (Sandbox Code Playgroud)
其余这些工具的想法相同.代码和规范看起来非常相似,这是Perl的优点之一.