my @c= map {
my $v=$_;
map {$_ * $v } @m
} @a;
这样使用map
这是一个好习惯吗?为什么不?
如果没有,还有其他方法吗?
答案 0 :(得分:5)
我无法回答这是否是一种好习惯。通常,在很多情况下我会使用嵌套映射。它简短,简明扼要。
然而,这样的嵌套地图总是存在增长的危险,只是稍微过大和笨拙,在这种情况下,它们变得比它们更难阅读($_
哪个列表在哪种情况下引用!?)。所以使用它们,是的,但要谨慎使用它 - 就像所有其他类似的东西一样,使Perl如此简洁和富有表现力。
答案 1 :(得分:3)
我不确定你的意思。它会工作得很好,或者你在询问可读性?与等效的foreach循环相比,读取长map
可能更难。
my @c;
for my $v (@a) {
push @c, map { $_ * $v } @m;
}
答案 2 :(得分:1)
我总是对map
命令感到复杂。使用map
存在许多陷阱,而这正是让人们对Perl难以理解的问题感到沮丧的原因之一。此外,map
实际上并不比使用常规循环更有效。
当地图修改$_
的值时会有gotcha,因为它实际上只是原始数组中值的别名。修改$_
,然后修改原始数组。也许这就是你想要的,但是map
命令可能会掩盖它。在Perl Monks中讨论map
。
即使您在map
中使用map
确实有效(map
确实为您$_
本地化,因此$_
合并map
$_
}与其他map
中的map
不同,存在可读性和可维护性问题。
仅在用法清晰且易于理解上下文时使用{{1}}。为电子邮件sigs保存聪明的Perl技巧。我不会使用map-within-map。
答案 3 :(得分:0)
嵌套map
与任何其他嵌套结构具有相同的问题和解决方案,除非需要重新分配$_
。嵌套map
不流动的事实是代码气味:您的代码试图告诉您应该稍微改变它的结构。
适当的改变是将内部操作转换为函数调用,以便读者不必同时跟踪两个作用域。在这种情况下,你得到:
sub scale {
my ($factor, @numbers) = @_;
return map { $factor * $_ } @numbers;
}
my @c = map { scale($_, @m) } @a;