1
my @c= map {
        my $v=$_;
        map {$_ * $v } @m
} @a;

像这样使用map是一种好习惯吗?为什么不?如果没有,还有什么其他方法?

4

4 回答 4

5

我无法回答这是否是好的做法。一般来说,在很多情况下,我会大量使用嵌套地图。它很简短,简明扼要。

然而,这样的嵌套地图总是有变得有点太大和笨拙的危险,在这种情况下它们变得比它们必须的更难阅读($_在这种情况下哪个列表确实指的是!?)。所以使用它们,是的,但要谨慎使用——就像所有其他使 Perl 如此简洁和富有表现力的类似事物一样。

于 2012-10-16T14:35:01.897 回答
3

我不确定你是什么意思。它会很好地工作,还是您在询问可读性?map与等效的 foreach 循环相比,读取 long 可能更难。

my @c;
for my $v (@a) {
   push @c, map { $_ * $v } @m;
}
于 2012-10-16T14:33:42.820 回答
1

map对于指挥部,我总​​是有复杂的感觉。使用 . 有很多陷阱map,这是让 Python 人幸灾乐祸的原因之一。 Perl 是多么不可读。此外,它map并没有比使用常规循环更有效。

当 map 修改 的值时有一个陷阱$_, 因为它实际上只是原始数组中值的别名。Modify $_,然后您修改原始数组。也许这就是您想要的,但是该map命令可能会掩盖这一点。Perl Monks中有一个关于map.

即使您对 inside 的使用map确实map有效(确实为您map本地化,因此in与另一个不同),也存在可读性和可维护性的问题。$_$_map$_map

仅在用法map清晰且易于理解上下文时使用。保存电子邮件签名的聪明 Perl 技巧。我不会使用地图内地图。

于 2012-10-16T15:43:00.270 回答
0

嵌套map与任何其他嵌套结构具有相同的问题和相同的解决方案,除了因需要重新分配而略微放大$_。嵌套不流动的事实map是代码异味:您的代码试图告诉您应该稍微不同的结构。

适当的更改是将内部操作变成函数调用,这样读者就不必同时跟踪两个作用域。在这种情况下,您会得到:

sub scale {
    my ($factor, @numbers) = @_;

    return map { $factor * $_ } @numbers;
}

my @c = map { scale($_, @m) } @a;
于 2012-10-16T15:58:43.603 回答