首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl -使用递归函数将数组哈希转换为数组。

Perl -使用递归函数将数组哈希转换为数组。
EN

Stack Overflow用户
提问于 2017-05-30 03:38:37
回答 1查看 173关注 0票数 0

我在脚本中创建了以下数组哈希(称为$hoa):

代码语言:javascript
复制
$hoa = {
      'Continents' => [
                        'Continent1',
                        'Continent2',
                        'Continent3'
                      ],
      'Earth' => [
                   'Continents'
                 ],
      'Continent1' => [
                        'Country1'
                      ],
      'Continent3' => [
                        'Country3'
                      ],
      'Country1' => [
                      'City1',
                      'City2'
                    ]
    };

我想将它转换为一个数组,以便在脚本的后面部分使用。数组的数组应该如下所示:

代码语言:javascript
复制
$aoa=[
    ['Earth','Continents','Continent1','Country1','City1'],
    ['Earth','Continents','Continent1','Country1','City2'],
    ['Earth','Continents','Continent2'],
    ['Earth','Continents','Continent3','Country3']
];

我已经创建了下面的代码来完成这个任务,但是它并不像预期的那样工作。

代码语言:javascript
复制
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的方式如下(这不是我所期望的):

代码语言:javascript
复制
$VAR1 = [
      [
        'Country1',
        'City1'
      ],
      [
        'Country1',
        'City2'
      ],
      [
        'Continents',
        'Continent2'
      ],
      [
        'Continent3',
        'Country3'
      ]
    ];

请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 03:57:13

最低限度的改动:

代码语言:javascript
复制
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 );

以上经清理的版本:

代码语言:javascript
复制
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');

另一种方法是将路径传递到树的根部,而不是保持在路径的前面。这稍微简化了一些事情。

代码语言:javascript
复制
sub flatten {
    my $tree = shift;
    my $node = $tree->{ $_[-1] };
    return [ @_ ] if !$node;
    return map { flatten($tree, @_, $_) } @$node;
}

my @flattened = flatten($tree, 'Earth');
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44253030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档