在perl中使用嵌套映射是一种很好的做法吗?

时间:2012-10-16 14:30:29

标签: perl map weak-typing

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

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

4 个答案:

答案 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;