-1

好吧,我有一个函数可以生成一个哈希树,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 的转储程序显示:

$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' 会失败。但是,如果我转义点,则键不匹配...
4

1 回答 1

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'}});

您的哈希格式没有多大意义。它将字段名称和实际数据混合为键。

于 2013-04-19T22:04:58.617 回答