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

现在,您必须将其取消引用为哈希。但是,由于它不是一个简单的标量,因此您必须将其放在大括号中。要获得整个哈希值,您需要%在大括号前添加一个:

%{ $h{'a'} }

现在你想要一个切片,所以你%用一个替换@,因为你得到了多个元素,你也像往常一样把你的键放在最后:

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

单独查看大括号可能看起来更容易:

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

为了简化这一点,v5.20 引入了postfix 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 回答