my @c= map {
my $v=$_;
map {$_ * $v } @m
} @a;
像这样使用map
是一种好习惯吗?为什么不?如果没有,还有什么其他方法?
my @c= map {
my $v=$_;
map {$_ * $v } @m
} @a;
像这样使用map
是一种好习惯吗?为什么不?如果没有,还有什么其他方法?
我无法回答这是否是好的做法。一般来说,在很多情况下,我会大量使用嵌套地图。它很简短,简明扼要。
然而,这样的嵌套地图总是有变得有点太大和笨拙的危险,在这种情况下它们变得比它们必须的更难阅读($_
在这种情况下哪个列表确实指的是!?)。所以使用它们,是的,但要谨慎使用——就像所有其他使 Perl 如此简洁和富有表现力的类似事物一样。
我不确定你是什么意思。它会很好地工作,还是您在询问可读性?map
与等效的 foreach 循环相比,读取 long 可能更难。
my @c;
for my $v (@a) {
push @c, map { $_ * $v } @m;
}
map
对于指挥部,我总是有复杂的感觉。使用 . 有很多陷阱map
,这是让 Python 人幸灾乐祸的原因之一。 Perl 是多么不可读。此外,它map
并没有比使用常规循环更有效。
当 map 修改 的值时有一个陷阱$_
, 因为它实际上只是原始数组中值的别名。Modify $_
,然后您修改原始数组。也许这就是您想要的,但是该map
命令可能会掩盖这一点。Perl Monks中有一个关于map
.
即使您对 inside 的使用map
确实map
有效(确实为您map
本地化,因此in与另一个不同),也存在可读性和可维护性的问题。$_
$_
map
$_
map
仅在用法map
清晰且易于理解上下文时使用。保存电子邮件签名的聪明 Perl 技巧。我不会使用地图内地图。
嵌套map
与任何其他嵌套结构具有相同的问题和相同的解决方案,除了因需要重新分配而略微放大$_
。嵌套不流动的事实map
是代码异味:您的代码试图告诉您应该稍微不同的结构。
适当的更改是将内部操作变成函数调用,这样读者就不必同时跟踪两个作用域。在这种情况下,您会得到:
sub scale {
my ($factor, @numbers) = @_;
return map { $factor * $_ } @numbers;
}
my @c = map { scale($_, @m) } @a;