如何从哈希表中获取哈希切片?

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行,使用未定义值作为数组引用。 该错误发生在print语句处。
我期望的输出结果是: 1,2
2个回答

20
要从嵌套的哈希中获取哈希切片,您需要逐步取消引用。您首先获取所需的第一级:
$h{'a'}

现在,你需要将其作为哈希表进行解引用。但是,由于它不是简单的标量,所以你需要将它放入花括号中。要获取整个哈希表,你需要在花括号前面加上%
%{ $h{'a'} }

现在你想要一个切片,所以你用@替换了%,因为你要获取多个元素,同时你也像往常一样将键放在最后:
@{ $h{'a'} }{ @keys }

它可能看起来更容易分别看到大括号:

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

为了让这个过程更简单,v5.20引入了后缀解引用。不需要将事物包裹在花括号中并从内部向外工作,而是可以从左到右进行操作。
$h{a}->@{qw/one two/};

@ 是你在第一个大括号前看到的相同符号。因为紧随其后的是大括号,所以你仍然知道它是哈希切片。


2

尝试

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

使用Data::Dumper在像这样的情况下非常有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接