我可以将这个 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/