我已经全职编写perl代码几个月了(生物信息学),并且一直在努力提高自己的技能。就在今天,我突然意识到我从来不使用map或grep。回顾我的代码,我意识到这些工具可以为我节省几行代码,但代价是foreach循环的灵活性。我的问题如下:
除了节省一两行代码之外,您还遇到过使用map或grep比foreach/for循环带来显著优势的情况吗?
耽误您时间,实在对不起!
发布于 2011-04-07 09:21:27
Schwartzian Transform就是一个例子:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, foo($_)] }
@unsorted;您可以使用一堆foreach循环来做到这一点,但您必须将它们拆分开来才能弄清楚发生了什么;一旦您看到了施瓦茨变换,您就会立即识别出这个习惯用法。
总的来说,我认为map和grep很好,因为它们允许您在没有语法层的情况下清楚而紧凑地表示您的意图。如果您看到一个map,那么您就知道正在进行某种简单的数据结构转换;如果您看到一个grep,那么您就知道正在进行某种过滤/选择。您可以使用foreach完成所有这些工作,但是代码的意图并不像使用map或grep那样清晰;如果您愿意,您甚至可以使用if和goto完成所有这些工作,但是这样您的意图就会被更多的语法和状态跟踪所掩盖。
发布于 2011-04-07 09:47:38
我经常使用map和grep。以及来自List::MoreUtils的apply、first、any和许多其他网站。我发现,一般来说,它们解释了代码正在做什么,而不是代码是如何做的。
一般来说,我发现当我的代码读起来与规范相同时,它更有可能是正确的,也更有可能处理角落/边缘情况。Perl使我能够比我过去使用的任何语言更好地做到这一点,我利用了这一点。
例如,如果我的规范说如果$blah在某个列表中,我将执行foo(),那么我的代码就是这样读的:
foo() if any { $_ eq $blah } some_list();其余的工具也有同样的想法。代码和规范看起来异乎寻常地相似,这是Perl最棒的地方之一。
https://stackoverflow.com/questions/5574800
复制相似问题