Perl:切片哈希数组

Perl: slicing an array of hashes

下面代码的输出总是空的。不确定我做错了什么,希望得到任何帮助。如何获取哈希数组中特定哈希中的键值?

use strict;
use warnings;

my %dot1 = ('a'=>1,'b'=>2);
my %dot2 = ('a'=>3,'b'=>4);
my %dot3 = ('a'=>5,'b'=>6);
my %dot4 = ('a'=>7,'b'=>8);

my @array = (%dot1,%dot2,%dot3,%dot4);

my %x = $array[2];
my $y = $x->{'a'};

print "$y \n";

如果你想要一个散列引用数组,你需要明确说明。

my @array = (\%dot1, \%dot2, \%dot3, \%dot4);
my %x = %{$array[2]};
my $y = $x{a};
print "$y\n";

您要做的是将对您的散列的引用添加到您的 @array,否则 perl 将在列表上下文中计算散列。

my @array = (\%dot1,\%dot2,\%dot3,\%dot4);
my $x = $array[2];
my $y = $x->{'a'};

print "$y \n";

您没有哈希数组。您有一个看起来像散列的数组,其中键 ab 将分别出现四次,顺序相对随机。

print Dumper \@array;
$VAR1 = [
          'a',
          1,
          'b',
          2,
          'a',
          3,
          'b',
          4,
          'a',
          5,
          'b',
          6,
          'a',
          7,
          'b',
          8
        ];

之后,您正在使用 $x->{a},这是从哈希引用 $x 中获取密钥 a 的语法,但您只声明了一个哈希 %a .这反过来又打破了,因为你给它一个奇数大小的单值列表。

相反,将对散列的引用添加到您的数组中。这样您将获得多级数据结构而不是平面列表。然后使 x 变量成为标量 $x.

my %dot1 = ('a'=>1,'b'=>2);
my %dot2 = ('a'=>3,'b'=>4);
my %dot3 = ('a'=>5,'b'=>6);
my %dot4 = ('a'=>7,'b'=>8);

my @array = (\%dot1,\%dot2,\%dot3,\%dot4); # here


my $x = $array[2]; # here
my $y = $x->{'a'};

print "$y \n";

这将打印 5.

您应该阅读 perlref and perlreftut 中的数据结构。