Я довольно часто пишу такие фрагменты кода:
if (exists $myHash->{$key}) {
$value = $myHash->{$key};
}
Что я пытаюсь сделать, так это получить значение из хэша, если хэш содержит этот ключ, и в то же время я хочу избежать автооживления записи хеша, если она еще не существует.
Однако мне кажется, что это довольно неэффективно: я выполняю поиск по хешу, чтобы узнать, существует ли ключ, а затем, если он существует, я выполняю еще один поиск по хешу того же ключа, чтобы извлечь его.
Это становится еще более неэффективным в многоуровневой структуре:
if (exists $myHash->{$key1}
&& exists $myHash->{$key1}{$key2}
&& exists $myHash->{$key1}{$key2}{$key3}) {
$value = $myHash->{$key1}{$key2}{$key3};
}
Здесь я, предположительно, выполняю 9 хэш-поисков вместо 3!
Достаточно ли умен Perl, чтобы оптимизировать такой случай? Или есть какая-то другая идиома для получения значения хеша без автооживления записи или выполнения двух последовательных поисков?
Мне известен модуль автовивификации, но, если возможно, я ищу решение, не требующее XS модуль, который необходимо установить. Также у меня не было возможности опробовать этот модуль, и я не совсем уверен, что происходит в случае многоуровневого хеша — модуль говорит, что это:
$h->{$key}
вернет undef, если ключ не существует - значит ли это, что это:
$h->{$key1}{$key2}
умрет, если $key1 не существует, на том основании, что я пытаюсь разыменовать undef? Если это так, чтобы избежать этого, по-видимому, вам все равно нужно будет проводить многоуровневые тесты на существование.