PERL - статьи

Массивы хэшей


Массивы хэш-таблиц позволяют индексировать числовым значением записи с

именованными полями. В следующем примере создается массив хэшей:

@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";

}


Содержание раздела