对于我来说,我看起来像一个简单的概念问题。在努力寻找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},
},
};
以递归方式遍历此哈希的代码:
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);
}
}
答案 0 :(得分:12)
我不确定你在调用analyse_contig_tree_recursively
的是什么(你没有在任何地方使用$contig_hash
参数,而你还没有定义$TAXA_LEVEL
:你的意思是{ {1}}?),但是数据结构布局和递归遍历模式之间显然存在不匹配。您的遍历函数假定所有条目都是哈希值,并将空哈希值视为终止案例:如果$TAXA_TREE
为空,则不存在递归调用。根据您的数据,您需要测试值是否为哈希值,如果您发现它不是哈希值,则不会递归。
keys %{$TAXA_TREE}