Обращение к элементам хеша

Чтобы обратиться к элементу хеша, используйте синтаксис следующего вида:

$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[5]. Мы, люди, должны поступать так же, как поступает Perl, – смотреть на знаки до и после идентификатора, чтобы понять, что он означает.


Если перед именем стоит знак $, а после него – фигурные скобки, значит, происходит обращение к элементу хеша. Разумеется, ключ хеша может задаваться любым выражением, не только строковыми литералами и простыми скалярными переменными:

$foo = "bar";
print $family_name{ $foo . "ney" }; # Выводит "rubble"

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

$family_name{"fred"} = "astaire"; # Задает новое значение
# для существующего элемента
$bedrock = $family_name{"fred"}; # Возвращает "astaire"; старое
# значение теряется

По сути происходит то же самое, что при использовании массивов и скаляров: если вы сохраняете новое значение в $pebbles[17] или $dino, старое значение при этом заменяется. Если сохранить новое значение в $family_name{"fred"}, старое значение также будет заменено. Элементы хешей создаются присваиванием:

$family_name{"wilma"} = "flintstone"; # Добавляет новый ключ
# (и значение)
$family_name{"betty"} .= $family_name{"barney"}; # Создает новый элемент
# в случае необходимости

И здесь происходит то же самое, что с массивами и скалярами: если ранее элемент $pebbles[17] или переменная $dino не существовали, они автоматически создаются присваиванием.


Если ранее элемент $family_name{"betty"} не существовал, теперь он существует. При обращении к несуществующему элементу хеша возвращается
undef:

$granite = $family_name{"larry"}; # Ключа larry нет: undef

И снова здесь происходит то же, что с массивами и скалярами: если элемент $pebbles[17] или переменная $dino не были инициализированы, обращение к ним возвращает undef. Если элемент хеша $family_name{"larry"} не был инициализирован, обращение к нему также возвращает undef.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Зачем использовать хеш?
Интерполяция элементов хеша
Присваивание хешей
Типичные операции с хешами
Функции keys и values

Вернуться в раздел: Perl / 5. Хеши