将多维数组转换为一维数组的更好方法

rpg*_*rpg 1 arrays perl

目前,我使用以下代码将不规则的多维数组转换为一维数组.

my $array = [0, 
        [1],
        2,
        [3, 4, 5],
        [6, 
            [7, 8, 9 ],
        ],
        [10],
        11,
        ];

my @mylist;
getList($array);

print Dumper (\@mylist);


sub getList

{

        my $array = shift;

        return if (!defined $array);
        if (ref $array eq "ARRAY")
        {
               foreach my $i (@$array)
               {
                   getList($i);
               }
        }
        else
        {
               print "pushing $array\n";
               push (@mylist, $array);
        }
}
Run Code Online (Sandbox Code Playgroud)

这基于递归,我在检查每个元素.如果element是对数组的引用,则使用新数组递归调用它.

有没有更好的方法来解决这类问题?

bti*_*lly 7

首先,您的函数不应该通过修改全局变量来返回数据.改为返回一个列表.

至于效率,Perl具有令人惊讶的大型函数调用开销.因此,对于大型数据结构,我更喜欢非递归方法.像这样:

use Data::Dumper;
my $array = [
  0, 
  [1],
  2,
  [3, 4, 5],
  [6, [7, 8, 9 ]],
  [10],
  11,
];

my @mylist = get_list($array);

print Dumper (\@mylist);

sub get_list {
    my @work = @_;
    my @result;
    while (@work) {
        my $next = shift @work;
        if (ref($next) eq 'ARRAY') {
            unshift @work, @$next;
        }
        else {
            push @result, $next;
        }
    }
    return @result;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用的格式符合perlstyle的建议.我们都知道争论One True Brace风格是徒劳的.但至少我建议你减少8个空格缩进.对此进行了研究,并且已经证明代码理解在2-4空间范围内具有缩进.阅读代码完成了解详情.对于年轻人而言,你在这个范围内并不重要,但是视力正在发展的年长程序员会找到更好的缩进.阅读Perl最佳实践以获取更多信息.