Массивы хэшей
Массивы хэш-таблиц позволяют индексировать числовым значением записи с
именованными полями. В следующем примере создается массив хэшей:
@array = (
{
favorite => "apples",
'second favorite' => "оranges"
},
{
favorite => "corn",
'second favorite' => "peas",
'last favorite' => "turnip"
},
{
favorite => "chiken",
'second favorite' => "beef"
}
print $array[0]{favorite};
Обратите внимание, что для конструкций вида [...]{...},
как и для рассматриваемых ранее конструкций
вида {...}{...} и
[ ][[ ], между парами скобок неявно
подставляется оператор-стрелка -> разыменования ссылок.
Создание массива хэшей на лету
Можно создавать массивы хэшей шаг за шагом, присваивая
ссылки на анонимные хэши элементам массива:
@аггау[0] = {favorite => "apples",
'second favorite' => "oranges"};
@array[1] = {favorite => "corn",
'second favorite' => "peas",
'least favorite' => "turnip"};
@array[2] = {favorite => "chicken",
'second favorite' => "beef"};
print $array[0]{favorite};
Как и в случае массива массивов, вы можете воспользоваться функцией push:
push @array, {favorite => "apples",
'second favorite' => "oranges"};
push @array, {favorite => "corn",
'second favorite' => "peas",
'least favorite' => "turnip"};
push @array, {favorite => "chicken",
'second favorite' => "beef"};
print $array[0]{favorite};
В следующем примере мы последовательно читаем из текстовых строк пары
ключ/значение и превращаем их в массив хэшей:
$data[0] = "favorite:apples, second favorite:оranges";
$data[1] = "favorite:corn, second favorite:peas, least favorite:turnip";
$data[2] = "favorite:chicken, second favorite:beef";
for $loopindex (O..$#data) {
for $element(split ',', $data[$loopindex]){
($key, $value) = split ':', $element;
$key=~s/^[\s\n]+//; #очистить от пробелов
$key=~s/[\s\n]+$//;
$value =~s/^[\s\n]+//; #очистить от пробелов
$value =~s/[\s\n]+$//;
$array[$loopindex]{$key} = $value;
}
}
print $array[0]{'second favorite'};
Обратите внимание, что мы здесь воспользовались контекстно-чувствительной
процедурой автооживления ссылок (autovivification)
Доступ к элементам массива хэшей
Чтобы получить значение, хранимое; в массиве хэшей, надо указать индекс
массива и ключ хэша:
$array[0] = {favorite => "apples",
'second favorite' => "oranges"};
$array[1] = {favorite => "corn",
'second favorite' => "peas",
'least favorite' => "turnip"};
$array[2] = {favorite => "chicken",
'second favorite' => "beef"};
print $array[0]{favorite};
В следующем случае мы полностью выводим массив хэшей с помощью цикла по
его элементам:
$array[0] = {favorite => "apples",
second => "oranges"};
$array[1] = {favorite => "corn",
second => "peas",
least => "turnip"};
$array[2] = {favorite => "chicken",
second => "beef"};
for $loopindex (0..$#array) {
print "array[$loopindex]:\n\t{";
fоr $key (keys %{$array[$loopindex]})
{
print "$key => $array[$loopindex]{$key},";
}
print "}\n";
A вот как сделать то же самое, используя вместо индекса цикла ссылку:
$array[0] = {favorite => "apples",
second => "oranges"};
$array[1] = {favorite => "corn",
second => "peas",
least => "turnip"};
$array[2] = {favorite => "chicken",
second => "beef"};
for $hashreference(@array) {
print "{";
for $key (sort keys %$hashreference) {
print "$key => $array[$loopindex]{$key}, ";
}
print ,"}\n";
}