如何分解两个列表
how to factorize two lists
有没有办法在 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);
}
}
这很好用,但我想知道是否有更多 "perlish" 方法可以做到这一点?
谢谢:)
您可以使用 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 中关于样式的普遍共识是使用蛇形变量名。尽管 camel case 以我们的骆驼命名,但我们不将它用于变量。仅适用于包名称。
任意数量列表的解决方案:
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);
}
其他替代 CPAN 模块是:
@listC = glob join '', map '{' . join(',', map quotemeta, @$_) . '}', \@listA, \@listB;
有没有办法在 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);
}
}
这很好用,但我想知道是否有更多 "perlish" 方法可以做到这一点?
谢谢:)
您可以使用 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 中关于样式的普遍共识是使用蛇形变量名。尽管 camel case 以我们的骆驼命名,但我们不将它用于变量。仅适用于包名称。
任意数量列表的解决方案:
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);
}
其他替代 CPAN 模块是:
@listC = glob join '', map '{' . join(',', map quotemeta, @$_) . '}', \@listA, \@listB;