【发布时间】:2013-04-19 21:56:22
【问题描述】:
好吧,我有一个函数可以生成一个哈希树,dumper 打印出来看起来像这样:
$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 的 dumper 显示:
$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' 会失败。但是,如果我转义点,则键不匹配...
【问题讨论】:
-
你应该看看perlref。看起来你对
\` and$hash_ref`感到困惑。 -
顺便说一句,
\%{pop(@stack)}是一种奇怪的做法pop(@stack)。 -
我的 perl 生锈了,我不会在那里争论。阅读它。 Pop 很奇怪...... pop(@stack) 本身就可以正常工作。
-
您不需要通过“\%{xxx}”进行持续引用和取消引用 - 这与您的简单“xxx”相同。
-
%$ref取消引用哈希,然后\创建对它的引用。这就像在做$n-1+1。