对于我来说,我看起来像一个简单的概念问题.在努力寻找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->{$_}); } } }