首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Perl中使用map或grep

在Perl中使用map或grep
EN

Stack Overflow用户
提问于 2011-04-07 09:13:29
回答 2查看 1.1K关注 0票数 14

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

除了节省一两行代码之外,您还遇到过使用map或grep比foreach/for循环带来显著优势的情况吗?

耽误您时间,实在对不起!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-07 09:21:27

Schwartzian Transform就是一个例子:

代码语言:javascript
复制
@sorted = map  { $_->[0] }
          sort { $a->[1] cmp $b->[1] }
          map  { [$_, foo($_)] }
          @unsorted;

您可以使用一堆foreach循环来做到这一点,但您必须将它们拆分开来才能弄清楚发生了什么;一旦您看到了施瓦茨变换,您就会立即识别出这个习惯用法。

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

票数 40
EN

Stack Overflow用户

发布于 2011-04-07 09:47:38

我经常使用mapgrep。以及来自List::MoreUtilsapplyfirstany和许多其他网站。我发现,一般来说,它们解释了代码正在做什么,而不是代码是如何做的。

一般来说,我发现当我的代码读起来与规范相同时,它更有可能是正确的,也更有可能处理角落/边缘情况。Perl使我能够比我过去使用的任何语言更好地做到这一点,我利用了这一点。

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

代码语言:javascript
复制
foo() if any { $_ eq $blah } some_list();

其余的工具也有同样的想法。代码和规范看起来异乎寻常地相似,这是Perl最棒的地方之一。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5574800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档