我现在已经全职写Perl代码几个月了(生物信息学),并且一直在努力提高我的技能。就在今天,我意识到我从来没有使用过map或grep。回顾我的代码,我意识到这些工具可以为我节省一些行代码,但只是以foreach循环的灵活性为代价。我的问题如下:
您是否遇到过任何情况,使用map或grep比使用foreach/for循环带来了显着优势(除了节省一两行代码)?
感谢您的时间!
我现在已经全职写Perl代码几个月了(生物信息学),并且一直在努力提高我的技能。就在今天,我意识到我从来没有使用过map或grep。回顾我的代码,我意识到这些工具可以为我节省一些行代码,但只是以foreach循环的灵活性为代价。我的问题如下:
您是否遇到过任何情况,使用map或grep比使用foreach/for循环带来了显着优势(除了节省一两行代码)?
感谢您的时间!
这里有一个例子:Schwartzian Transform。
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@unsorted;
你可以使用大量的foreach
循环来实现,但是你必须分开它们才能弄清楚发生了什么;一旦你看到了Schwartzian Transform,你就会立刻认出这个习惯用法。
总体而言,我认为map
和grep
很好,因为它们允许你清晰、简洁地表示你的意图,而不需要多层语法。如果你看到一个map
,那么你知道正在进行一些简单的数据结构转换;如果你看到一个grep
,那么你知道正在进行一些过滤/选择。你可以使用所有的foreach
,但是你的代码意图不如使用map
或grep
清晰;你甚至可以使用if
和goto
来完成所有操作,但是你的意图将被埋在更多的语法和状态跟踪中。
List::MoreUtils
的建议,这个软件包提供了一些有用的工具,可以帮助你让代码更符合你的意图。 - mu is too short我经常使用map
和grep
,还有List::MoreUtils
中的apply
、first
、any
等等。通常来说,它们会解释代码在做什么而不是怎么做。
一般来说,当我的代码读起来与规范相同时,它更可能是正确的,并且也更可能处理边缘情况。 Perl让我比以前使用的任何语言都做得更好,并且我充分利用了它。
例如,如果我的规范说,如果$blah
在某个列表中,我将执行foo()
,那么我的代码也会完全按照这种方式读取:
foo() if any { $_ eq $blah } some_list();
对于其余工具,理念相同。代码和规范看起来非常相似,这也是 Perl 的一大优点。