4

私は次のようなハッシュを持っています:

my %h = ( a => { one => 1,
                 two => 2
             },
          b => { three => 3,
                 four => 4
             },
          c => { five => 5,
                 six => 6
             }
      );

print join(',', @{$h{a}{qw/one two/}});

私が得るエラーは次のとおりです。印刷のある行であるq.pl行17で、未定義の値をARRAY参照として使用できません。

私が期待したのは1,2です

4

2 に答える 2

20

ネストされたハッシュからハッシュ スライスを取得するには、段階的に逆参照する必要があります。必要な最初のレベルを取得します。

$h{'a'}

ここで、それをハッシュとして逆参照する必要があります。ただし、単純なスカラーではないため、中かっこで囲む必要があります。ハッシュ全体を取得するに%は、中括弧の前にa を置きます。

%{ $h{'a'} }

スライスが必要になったので、複数の要素を取得しているため、 を に置き換え、%通常@どおりキーを最後に配置します。

@{ $h{'a'} }{ @keys }

中括弧を個別に見る方が簡単に見えるかもしれません:

@{         }{       }
   $h{'a'}    @keys

これを簡単にするために、v5.20 では接尾辞 dereferenceが導入されました。中括弧で囲んで内側から作業する代わりに、左から右に作業できます。

$h{a}->@{qw/one two/};

これ@は、最初のブレースの前で見たものと同じです。記号の後にブレースが続くため、ハッシュ スライスであることがわかります。

于 2009-11-23T12:05:15.633 に答える
2

試す

print join(',',@{$h{'a'}}{qw/one two/});

Data::Dumper の使用は、このような場合に非常に役立ちます

于 2009-11-23T08:36:29.393 に答える