Чтобы обратиться к элементу хеша, используйте синтаксис следующего вида:
$hash{$some_key}
Он напоминает синтаксис обращения к элементам массива, но вместо индекса в квадратных скобках указывается ключ в фигурных скобках. Вдобавок ключ задается строковым, а не числовым выражением:
$family_name{"fred"} = "flintstone";
$family_name{"barney"} = "rubble";
Это позволяет применять конструкции следующего вида:
foreach $person (qw< barney fred >) {
print "I've heard of $person $family_name{$person}.\n";
}
Имена хешей подчиняются тем же правилам, что и остальные идентификаторы Perl (последовательность букв, цифр и символов подчеркивания, которая не может начинаться с цифры). Кроме того, они существуют в отдельном пространстве имен, т. е. элемент хеша $family_name{"fred"} никак не связан, например, с пользовательской функцией &family_name. Конечно, не стоит запутывать программу, присваивая разным сущностям одинаковые имена. Но Perl не станет возражать, если вы создадите скаляр с именем $family_name и элементы массива $family_name. Мы, люди, должны поступать так же, как поступает Perl, – смотреть на знаки до и после идентификатора, чтобы понять, что он означает. Если перед именем стоит знак $, а после него – фигурные скобки, значит, происходит обращение к элементу хеша. Разумеется, ключ хеша может задаваться любым выражением, не только строковыми литералами и простыми скалярными переменными:
$foo = "bar";
print $family_name{ $foo . "ney" }; # Выводит "rubble"
При сохранении данных в существующем элементе хеша они заменяют предыдущее значение:
$family_name{"fred"} = "astaire"; # Задает новое значение
# для существующего элемента
$bedrock = $family_name{"fred"}; # Возвращает "astaire"; старое
# значение теряется
По сути происходит то же самое, что при использовании массивов и скаляров: если вы сохраняете новое значение в $pebbles или $dino, старое значение при этом заменяется. Если сохранить новое значение в $family_name{"fred"}, старое значение также будет заменено. Элементы хешей создаются присваиванием:
$family_name{"wilma"} = "flintstone"; # Добавляет новый ключ
# (и значение)
$family_name{"betty"} .= $family_name{"barney"}; # Создает новый элемент
# в случае необходимости
И здесь происходит то же самое, что с массивами и скалярами: если ранее элемент $pebbles или переменная $dino не существовали, они автоматически создаются присваиванием. Если ранее элемент $family_name{"betty"} не существовал, теперь он существует. При обращении к несуществующему элементу хеша возвращается
undef:
$granite = $family_name{"larry"}; # Ключа larry нет: undef
И снова здесь происходит то же, что с массивами и скалярами: если элемент $pebbles или переменная $dino не были инициализированы, обращение к ним возвращает undef. Если элемент хеша $family_name{"larry"} не был инициализирован, обращение к нему также возвращает undef.