我在脚本中创建了以下数组哈希(称为$hoa):
$hoa = {
'Continents' => [
'Continent1',
'Continent2',
'Continent3'
],
'Earth' => [
'Continents'
],
'Continent1' => [
'Country1'
],
'Continent3' => [
'Country3'
],
'Country1' => [
'City1',
'City2'
]
};我想将它转换为一个数组,以便在脚本的后面部分使用。数组的数组应该如下所示:
$aoa=[
['Earth','Continents','Continent1','Country1','City1'],
['Earth','Continents','Continent1','Country1','City2'],
['Earth','Continents','Continent2'],
['Earth','Continents','Continent3','Country3']
];我已经创建了下面的代码来完成这个任务,但是它并不像预期的那样工作。
sub CreateArrofArr
{
my $arg={@_};
my $member=$arg->{member};
my $hoa=$arg->{hoa};
my $aoa=[];
if(exists($hoa->{$member}))
{
for(my $i=0; $i<scalar(@{$hoa->{$member}}); $i++)
{
my $elem=@{$hoa->{$member}}->[$i];
my $temp_arr=[];
if(!exists($hoa->{$elem}))
{
push(@{$temp_arr},$member);
push(@{$temp_arr},$elem);
push(@{$aoa},$temp_arr);
}
else
{
push(@{$aoa},@{CreateArrofArr(member=>$elem,hoa=>$hoa)})
}
}
}
return ($aoa);
}
my $aoa=CreateArrofArr(member=>"Earth",hoa=>$hoa);
print Dumper($aoa);返回$aoa的方式如下(这不是我所期望的):
$VAR1 = [
[
'Country1',
'City1'
],
[
'Country1',
'City2'
],
[
'Continents',
'Continent2'
],
[
'Continent3',
'Country3'
]
];请帮帮忙。
发布于 2017-05-30 03:57:13
最低限度的改动:
sub CreateArrofArr {
my $arg = { @_ };
my $member = $arg->{member};
my $hoa = $arg->{hoa};
my $aoa = [];
if (exists($hoa->{$member})) {
for (my $i=0; $i<scalar(@{$hoa->{$member}}); $i++) {
my $elem = $hoa->{$member}->[$i];
push @{$aoa},
map { [ $member, @$_ ] }
@{ CreateArrofArr( member => $elem, hoa => $hoa ) };
}
} else {
my $temp_arr = [];
push @{$temp_arr}, $member;
push @$aoa, $temp_arr;
}
return $aoa;
}
my $aoa = CreateArrofArr( member => "Earth", hoa => $hoa );以上经清理的版本:
sub flatten {
my ($tree, $current) = @_;
my $node = $tree->{$current};
return [ $current ] if !$node;
return
map { [ $current, @$_ ] }
map { flatten($tree, $_) }
@$node;
}
my @flattened = flatten($tree, 'Earth');另一种方法是将路径传递到树的根部,而不是保持在路径的前面。这稍微简化了一些事情。
sub flatten {
my $tree = shift;
my $node = $tree->{ $_[-1] };
return [ @_ ] if !$node;
return map { flatten($tree, @_, $_) } @$node;
}
my @flattened = flatten($tree, 'Earth');https://stackoverflow.com/questions/44253030
复制相似问题