存储引用内容的哈希的Perl哈希 - 不能使用字符串(“”)作为HASH引用

时间:2013-04-19 21:56:23

标签: perl hash strict

好吧我有一个函数可以生成一个哈希树,转储器打印出来如下所示:

$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'}}

然后它工作正常。

更新:

  • 如果字符串包含'。'然后发生此错误。硬编码'小'有效。硬编码'stock_gui.vert'失败,除非我逃脱'。'。但是,如果我逃离点,那么键就不匹配了......

1 个答案:

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

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