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

Abh*_*bhi 6 recursion perl hash

对于我来说,我看起来像一个简单的概念问题.在努力寻找Web和Stack Overflow上的类似问题后,我找不到类似的东西,所以我想我可以问你.

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

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

它给了我以下错误:

在使用"严格参考"时,不能使用字符串("1")作为HASH参考

很明显:我的哈希必然会有一些值为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},
    },
};
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 12

我不确定你在调用什么analyse_contig_tree_recursively(你没有$contig_hash在任何地方使用该参数,你没有定义$TAXA_LEVEL:你的意思是$TAXA_TREE什么?),但你的数据结构布局和递归遍历模式之间显然不匹配.您的遍历函数假定所有条目都是哈希值,并将空哈希值视为终止案例:如果keys %{$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->{$_});
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或者`Scalar :: Util :: reftype($ TAXA_TREE - > {$ _})eq'HASH'`,如果数据结构可能包含祝福的对象. (4认同)