如何分解两个列表

时间:2018-01-22 15:43:07

标签: perl factorization

有没有办法在perl中轻松分解某些列表?

例如,有2个列表('a', 'b', 'c')('d', 'e', 'f') 我想要输出('ad', 'ae', 'af' .... 'ce', 'cf')

现在我正在做

use strict;
use warnings;

my @listA = ('a', 'b', 'c');
my @listB = ('d', 'e', 'f');
my @listC = ();

foreach my $elementA (@listA)
{
    foreach my $elementB (@listB)
    {
        push(@listC, $elementA.$elementB);
    }
}

这种方法很好,但我想知道是否有更“理解”的方法呢?

谢谢:)

4 个答案:

答案 0 :(得分:8)

您可以使用map使其更加 Perlish

my @list_a = qw( a b c );
my @list_b = qw( d e f );
my @list_c = map {
    my $temporary = $_;
    map { $temporary . $_ } @list_b
} @list_a;

这会产生与您上面相同的@list_c

我们需要$temporary变量,因为两个map都会设置主题$_,内部map会覆盖外部主题,所以我们必须保存它在另一个词汇中。

请注意,我重命名了您的变量并使用了qw(),因为您要求 Perlish 。 Perl中关于样式的共识是使用snake case变量名。尽管驼峰的情况以我们的骆驼命名,但我们不会将它用于变量。仅适用于包名称。

答案 1 :(得分:4)

任意数量的列表的解决方案:

use Algorithm::Loops qw( NestedLoops );

my @arrays = (
   [qw( a b c )],
   [qw( d e f )],
   ...
);

my @result;
NestedLoops(\@arrays, sub { push @result, join("", @_); });

my @result;
my $iter = NestedLoops(\@arrays);
while (my @comb = $iter->()) {
   push @result, join("", @comb);
}

答案 2 :(得分:4)

@listC = glob join '', map '{' . join(',', map quotemeta, @$_) . '}', \@listA, \@listB;

答案 3 :(得分:1)