存储引用的哈希的Perl哈希 - 不能使用字符串(" ")作为哈希引用



好了,我有一个函数,它生成一个散列树,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'}});

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

最新更新