在Perl中扩展列表引用
我在Perl中有一个列表,我正在尝试“扩展”它包含的任何列表 例如:在Perl中扩展列表引用,perl,Perl,我在Perl中有一个列表,我正在尝试“扩展”它包含的任何列表 例如: my @l = ( 'foo', ['A', 'B'], 'bar', ['X', 'Y', 'Z'], 'baz', ); 我想展开列表以获得以下信息: my @want = ( [qw/ foo A bar X baz /], [qw/ foo A bar Y baz /], [qw/ foo A bar Z baz /], [qw/ foo B bar X baz /], [qw
my @l = (
'foo',
['A', 'B'],
'bar',
['X', 'Y', 'Z'],
'baz',
);
我想展开列表以获得以下信息:
my @want = (
[qw/ foo A bar X baz /],
[qw/ foo A bar Y baz /],
[qw/ foo A bar Z baz /],
[qw/ foo B bar X baz /],
[qw/ foo B bar Y baz /],
[qw/ foo B bar Z baz /],
);
我想到了这个,它可以工作,但很难看,不能产生合理有序的数组:
my @out = ([]);
foreach my $elt (@l){
if( ref($elt) eq 'ARRAY' ){
my $n = scalar(@$elt);
my @_out;
# expand
for( my $i=0; $i<$n; $i++ ){
foreach my $o (@out){
push(@_out, [@$o]);
}
}
for( my $i=0; $i<@_out; $i++ ){
push(@{$_out[$i]}, $elt->[$i % $n]);
}
@out = @_out;
}
else{
foreach my $o (@out){
push(@$o, $elt);
}
}
}
my@out=([]);
foreach我的$elt(@l){
if(参考($elt)等式“数组”){
my$n=标量(@$elt);
我的"你出去了",;
#扩展
对于(my$i=0;$i,您似乎正在尝试计算数组中元素的笛卡尔积。您可以使用from CPAN来执行此操作:
use strict;
use warnings;
use Math::Cartesian::Product;
cartesian { print "@_","\n"; }
([qw(foo)], [qw(A B)], [qw(bar)], [qw(X Y Z)], [qw(baz)]);
# outputs
# foo A bar X baz
# foo A bar Y baz
# foo A bar Z baz
# foo B bar X baz
# foo B bar Y baz
# foo B bar Z baz
注意,这确实需要您将每个输入元素放置在arrayref中,如果您想要一个arrayref数组作为输出(从您的示例中),则需要在块中对该逻辑进行编码。虽然这是一个旧线程,但我想我应该添加另一个可能的解决方案
模块还将获得所需的结果。(输入数组元素必须都是数组引用。)
数据转储输出为
[
["foo", "A", "bar", "X", "baz"],
["foo", "A", "bar", "Y", "baz"],
["foo", "A", "bar", "Z", "baz"],
["foo", "B", "bar", "X", "baz"],
["foo", "B", "bar", "Y", "baz"],
["foo", "B", "bar", "Z", "baz"],
]
您正在寻找笛卡尔积。有几个模块可以实现这一点,但我个人喜欢。它需要一个arrayref的arrayref,但修改输入数组很容易。您没有列表,您有一个数组。您不是在尝试扩展列表,而是在尝试扩展数组。在Perl中。
[
["foo", "A", "bar", "X", "baz"],
["foo", "A", "bar", "Y", "baz"],
["foo", "A", "bar", "Z", "baz"],
["foo", "B", "bar", "X", "baz"],
["foo", "B", "bar", "Y", "baz"],
["foo", "B", "bar", "Z", "baz"],
]