perl - 我可以将这个 Perl 组合到一个单独的 map-grep 链中吗?

标签 perl map foreach grep

我可以将这个 Perl 组合到一个单独的 map-grep 链中吗? 一个小声音说我应该可以,但我不知道怎么做!

# expand sponsor keys in to a list of sponsor objects.
foreach my $event (@events) {
  next unless exists $event->{sponsors} && ! ref $event->{sponsors};
  $event->{sponsors} =
    [ map { $lookup{$_} }
        grep { exists $lookup{$_} }
          split( /\s*,\s*/, $event->{sponsors} ) ];
}

最佳答案

我是(可读)map-grep 链的忠实粉丝。尽管如此 虽然我知道 map 越来越能更好地处理在 void 上下文中的使用,我不喜欢使用 映射 在空上下文中。除此之外,我更喜欢哈希切片而不是 grepping 一些东西 数组。前提是lookup的值不是undef,grep所有的 从散列切片中定义的值应该和 grep 一样工作 存在的那些,然后将它们转换为查找值。

所以我提供了这个 map 解决方案:

map { 
    $_->{sponsors}
        = [ grep {; defined } @lookup{ split( /\s*,\s*/, $_->{sponsors} ) } ]
        ;
}
grep { $_->{sponsors} && !ref $_->{sponsors} }  @events
;

这里使用 map 的问题在于,您不是根据另一个项目创建一个列表。您正在更新一个列表。

就我的喜好而言,您也可以轻松地执行 do-foreach:

 do { 
    $_->{sponsors}
        = [ grep {; defined } @lookup{ split( /\s*,\s*/, $_->{sponsors} ) } ]
        ;
 }
 foreach { $_->{sponsors} && !ref $_->{sponsors} }  @events
;

但这与您原来的并没有什么不同。您可以轻松地将 foreach 放在顶部。但是那么你有一个循环,我对那里的 next 也没有问题。我认为最大的收获是使用散列切片而不是 grepping 并映射到相同的值。

关于perl - 我可以将这个 Perl 组合到一个单独的 map-grep 链中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19984350/

相关文章:

javascript - 禁用 anchor 跳

C++ 将索引绑定(bind)到一个数据结构

javascript - 如何在 forEach 中使用 Promise 来检查 forEach 是否完成?

.net - 用ForEach循环找不到重载

perl - 一个 CPAN 模块来解析 google 风格的搜索查询术语?

macos - 我希望 -e 在 OS X 上区分大小写。这可能吗?

perl - 使用 Plack 和 Middlewares 时将默认 perl 的 IO 切换为 utf-8 是否正确?

regex - 什么是用于查找字符串中第一个非连续重复字符的 Perl 正则表达式?

python - 用于在城市 map 上绘制点的好 python 工具包?

vb.net - VB.Net For Each Loop 查看什么来推断类型