Вы не имеете ога. У вас есть массив, содержащий как строки, так и ссылки на хеши. Это очень плохая структура данных. Это грязно и неэффективно, чтобы найти правильного врача.
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};
Это не массив хэшей, а хэш хешей. – leonbloy
Это не так, на самом деле – ikegami
массив 'string, href, string, href' –