加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何递归遍历嵌套的哈希数据结构?

发布时间:2020-12-15 22:05:47 所属栏目:大数据 来源:网络整理
导读:对于我来说,我看起来像一个简单的概念问题.在努力寻找Web和Stack Overflow上的类似问题后,我找不到类似的东西,所以我想我可以问你. 我正在构建一个深度嵌套的哈希数据结构的哈希.深度可以是10-20倍.为了这个问题,我只列出深度一. 我无法以递归方式遍历Perl中
对于我来说,我看起来像一个简单的概念问题.在努力寻找Web和Stack Overflow上的类似问题后,我找不到类似的东西,所以我想我可以问你.

我正在构建一个深度嵌套的哈希数据结构的哈希.深度可以是10-20倍.为了这个问题,我只列出深度一.

我无法以递归方式遍历Perl中的示例哈希.我也包括了我的代码.

它给了我以下错误:

Can’t use string (“1”) as a HASH ref while “strict refs” in use at

很明显:我的哈希必然会有一些值为1的键.我无法避免它们.

$VAR1 = {
    'Eukaryota' => {
        'Rhodophyta'         => {'count' => 5},'Alveolata'          => {'count' => 16},'stramenopiles'      => {'count' => 57},'count'              => 155,'Glaucocystophyceae' => {'count' => 1},'Cryptophyta'        => {'count' => 18},'Malawimonadidae'    => {'count' => 1},'Viridiplantae'      => {'count' => 57},},'Bacteria' => {
        'Cyanobacteria'       => {'count' => 1},'Actinobacteria'      => {'count' => 4},'count'               => 33,'Proteobacteria'      => {'count' => 25},'Deinococcus-Thermus' => {'count' => 2},'Firmicutes'          => {'count' => 1},};

用于递归遍历此哈希的代码:

sub analyse_contig_tree_recursively {
    my $TAXA_TREE   = shift @_;
    my $contig_hash = shift @_;
    foreach (keys %{$TAXA_TREE}) {
        print "$_ n";
        analyse_contig_tree_recursively($TAXA_LEVEL->{$_},$contig_hash);
    }
}

解决方法

我不确定你所谓的analyse_contig_tree_recursively是什么(你没有在任何地方使用那个$contig_hash参数,你还没有定义$TAXA_LEVEL:你的意思是$TAXA_TREE?),但你的数据结构显然不匹配布局和递归遍历模式.您的遍历函数假定所有条目都是哈希值,并将空哈希值视为终止案例:如果键%{$TAXA_TREE}为空,则不会进行递归调用.根据您的数据,您需要测试值是否为哈希值,如果您发现它不是哈希值,则不需要递归.
sub analyse_contig_tree_recursively {
    my $TAXA_TREE           =   shift @_;
    foreach ( keys %{$TAXA_TREE} ){
        print "$_ n";
        if (ref $TAXA_TREE->{$_} eq 'HASH') {
            analyse_contig_tree_recursively($TAXA_TREE->{$_});
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读