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

前端之家收集整理的这篇文章主要介绍了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->{$_});
        }
    }
}

猜你在找的Perl相关文章