2013-12-03 2 views
0

Привет, у меня есть массив хэшей, как показано ниже, я хочу получить элемент хэша доступа/элементы. Скажем, я хочу напечатать имя doct1, я не получаю правильный результат, пожалуйста, помогите мне, как мне это напечатать?Как получить доступ к массиву хешей?

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

Это не массив хэшей, а хэш хешей. – leonbloy

+4

Это не так, на самом деле – ikegami

+0

массив 'string, href, string, href' –

ответ

3

Массивы не имеют ключи,

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

Это ситуация, когда использование Data::Dumper важно, что вы на самом деле есть массив из двух строк и двух hashrefs. Если вы должны были распечатать его с 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

Вы не имеете ога. У вас есть массив, содержащий как строки, так и ссылки на хеши. Это очень плохая структура данных. Это грязно и неэффективно, чтобы найти правильного врача.

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

Это также возможно, что doct1 и doct2 бессмысленны, и что вы были бы счастливы, используя 0 и 1 вместо этого. Если да, то

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

doct1 Если и doct2 не имеет смысла, то самым чистым и самым эффективным решением было бы использовать НОН.

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}; 
0

Правая рука декларация не очень согласуется (в пределах) с назначением на массив. Вы, вероятно, хотите, чтобы назначить его хэш вместо:

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

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

Либо это или, ответ mpapec в.

Смежные вопросы