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

标签 perl recursion hash

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

我正在 build 一个 散列的散列深度嵌套的数据结构。深度可以是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 吗?),但是您的数据结构布局和您的递归遍历模式之间显然不匹配。您的遍历函数假定所有条目都是散列,并将空散列视为终止情况:if 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->{$_});
        }
    }
}

关于perl - 如何递归遍历嵌套的哈希数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6230663/

相关文章:

c++ - 从 Perl 代码调用 C++ 程序

JavaScript 递归反向字符串

ruby-on-rails - 在 Rails 中,将散列压缩为嵌套散列的最佳方法是什么

散列 2D、3D 和 nD 向量

bash - ssh perl 脚本未运行

perl - 我可以使用什么 Perl 模块来测试 CGI 输出的常见错误?

perl - 使用函数从对象或哈希中检索值

mysql - 连接 JOINS 或编写递归函数 - JOIN 查询的动态数量问题

c++ - 自顶向下递归下降解析 : Relying on tail call optimization