目前,我使用以下代码将不规则的多维数组转换为一维数组.
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是对数组的引用,则使用新数组递归调用它.
有没有更好的方法来解决这类问题?
首先,您的函数不应该通过修改全局变量来返回数据.改为返回一个列表.
至于效率,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最佳实践以获取更多信息.