好了,我有一个函数,它生成一个散列树,dump输出如下所示:
$VAR1 = {
'shaders' => {
'stock_gui.vert' => '',
'stock_font.vert' => '',
'stock_gui.frag' => '',
'stock_font.frag' => ''
},
'textures' => {},
'fonts' => {
'DroidSansMono.ttf' => '',
'small' => {
'DroidSansMono.ttf' => ''
}
}
};
现在我尝试dfs迭代例如字体子树:
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'}}
那么它可以正常工作。
更新:- 如果字符串包含'。,则出现此错误。硬编码"小"是有效的。硬编码'stock_gui。vert'失败,除非我转义'.'。但是,如果我转义点,键不匹配…
正如您自己运行它所看到的,
use strict;
use warnings;
my $tmpHash = {
'DroidSansMono.ttf' => '',
'small' => {
'DroidSansMono.ttf' => ''
}
};
my $subChildrenCount = scalar keys(%{$tmpHash->{'small'}});
你所说的给出错误的代码实际上并没有给出那个错误。我怀疑你真的在做
my $subChildrenCount = scalar keys(%{$tmpHash->{'DroidSansMono.ttf'}});
你的哈希格式没有多大意义。它将字段名和实际数据混合为键。