在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

我在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/ 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"],
]