好吧我有一个函数可以生成一个哈希树,转储器打印出来如下所示:
$VAR1 = {
'shaders' => {
'stock_gui.vert' => '',
'stock_font.vert' => '',
'stock_gui.frag' => '',
'stock_font.frag' => ''
},
'textures' => {},
'fonts' => {
'DroidSansMono.ttf' => '',
'small' => {
'DroidSansMono.ttf' => ''
}
}
};
现在我正在尝试dfs迭代,例如fonts子树:
push (@stack, \%{$myHash->{'fonts'}});
然后循环:
my $tmpHash = pop(@stack);
然后$ tmpHash的转储器显示:
$VAR1 = {
'DroidSansMono.ttf' => '',
'small' => {
'DroidSansMono.ttf' => ''
}
};
问题是尝试访问哈希引用的子代。我可以数上钥匙,看看孩子们。转储器输出看起来没问题。但是尝试做类似的事情:
foreach my $childKey ( keys $tmpHash ){
my $subChildrenCount = scalar keys(%{$tmpHash->{$childKey}});
}
产生错误:
Can't use string ("") as a HASH ref while "strict refs" in use
我认为这是因为$ tmpHash是一个哈希引用。我可能只需要在某个地方取消引用它。我尝试过很多东西,但都会产生更多问题。任何帮助表示赞赏。
如果我尝试:
%{$tmpHash->{'small'}}
然后它工作正常。
更新:
答案 0 :(得分:1)
正如您自己运行所见,
use strict;
use warnings;
my $tmpHash = {
'DroidSansMono.ttf' => '',
'small' => {
'DroidSansMono.ttf' => ''
}
};
my $subChildrenCount = scalar keys(%{$tmpHash->{'small'}});
你说的代码给出的错误实际上并没有给出错误。我怀疑你实际上在做什么
my $subChildrenCount = scalar keys(%{$tmpHash->{'DroidSansMono.ttf'}});
您的哈希格式没有多大意义。它将字段名称和实际数据混合为键。