-1

さて、ダンパーが次のように出力するハッシュツリーを生成する関数があります。

$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 に答える