如何访问哈希数组?

时间:2013-12-03 17:51:39

标签: perl

嗨我有一个哈希数组如下,我想访问哈希元素/元素。假设我想要打印doct1的名字,我没有得到正确的结果请帮帮我怎么打印?

@doctors = (
    'doct1' => {
          'name'            => 'abcd',
          'specialization'  => 'xyz',
          'city'            => 'pqr'
          },
    'doct2' => {
          'name'            => 'efgh',
          'specialization' => 'mno',
          'city'            => 'stu'
          }
);
print $doctors[0]{'name'};

4 个答案:

答案 0 :(得分:3)

阵列没有钥匙,

my @doctors = (
         {
          'name'            => 'abcd',
          'specialization'  => 'xyz',
          'city'            => 'pqr'
          },
         {
          'name'            => 'efgh',
          'specialization' => 'mno',
          'city'            => 'stu'
          }
);
print $doctors[0]{'name'};

答案 1 :(得分:3)

你没有AoH。你有一个包含字符串和哈希引用的数组。这是一个非常糟糕的数据结构。找到正确的医生是很麻烦和低效的。

my $i = 0;
$i += 2 while $i<@doctors && $doctors[$i] ne 'doct1';
die "Not found" if $i > @doctors;
say $doctors[$i+1]{name};

如果你有一个AoH,你看起来像这样:

my @doctors = (
   {
      id             => 'doct1',
      name           => 'abcd',
      specialization => 'xyz',
      city           => 'pqr',
   },
   {
      id             => 'doct2',
      name           => 'efgh',
      specialization => 'mno',
      city           => 'stu',
   },
);

那会更好。

my ($doctor) = grep { $_->{id} eq 'doct1' } @doctors
   or die "Not found";
say $doctor->{name};

doct1doct2也可能毫无意义,而您使用01感到满意。如果是的话,

die "Not found" if @doctors < 0;
say $doctors[0]{name};

如果doct1doct2没有意义,那么最干净,最有效的解决方案就是使用HoH。

my %doctors = (
   doct1 => {
      name           => 'abcd',
      specialization => 'xyz',
      city           => 'pqr',
   },
   doct2 => {
      name           => 'efgh',
      specialization => 'mno',
      city           => 'stu',
   },
);

代码就这么简单了:

my $doctor = $doctors{doct1}
   or die "Not found";
say $doctor->{name};

答案 2 :(得分:2)

这种情况下使用Data::Dumper是必不可少的,你实际拥有的是两个字符串和两个hashref的数组。如果您要使用Data :: Dumper将其打印出来,您会看到:

use Data::Dumper;
print Dumper \@doctors;
[
   'doct1',
   {
     'city' => 'pqr',
     'specialization' => 'xyz',
     'name' => 'abcd'
   },
   'doct2',
   {
     'city' => 'stu',
     'specialization' => 'mno',
     'name' => 'efgh'
   }
];

每个hashref都有代表医生的所有数据,前面的附加键没有任何意义。删除这些键,你将有这样的结构:

@doctors = (
          {
           'name'            => 'abcd',
           'specialization'  => 'xyz',
           'city'            => 'pqr'
          },
          {
           'name'            => 'efgh',
           'specialization'  => 'mno',
           'city'            => 'stu'
          }
);

现在您可以像预期的那样访问哈希属性:

print $doctors[0]{name};

答案 3 :(得分:0)

右手声明与数组的赋值不一致(意图)。您可能希望将其分配给哈希:

%doctors = (
    'doct1' => {
          'name'            => 'abcd',
          'specialization'  => 'xyz',
          'city'            => 'pqr'
          },
    'doct2' => {
          'name'            => 'efgh',
          'specialization' => 'mno',
          'city'            => 'stu'
          }
);

print $doctors{'doct1'}->{'name'};

要么是这个,要么是mpapec的答案。