2016-11-03 2 views
2

Учитывая массив, содержащий n элементов (n более 1), есть ли элегантный способ ссылаться на элемент в структуре хэша, где каждый элемент является ключом в последовательности?Хеши Perl с массивом ключей

Например:

my @foo = ('a','b','z'); 

Учитывая это или что-то подобное, я хотел бы получить доступ к следующим:

$hash->{'a'}->{'b'}->{'z'} 

Если это фиксированное число элементов, было бы просто, но Я не буду знать, сколько это будет во время выполнения (конечно, не более 6 или 7, но в противном случае неопознано).

Единственные узоры, которые я могу придумать, включают циклы и ссылки и выглядят неуклюжими. Есть ли что-то, что не занимает половину страницы или не требует Data :: Dumper, если у вас есть опечатка в нем только для отладки?

+0

См [ 'Data :: Diver'] (https://metacpan.org/pod/Data::Diver) и [' Hash :: Flatten'] (https://metacpan.org/pod/Hash::Flatten) –

+0

@ HåkonHægland Если вы включите свой комментарий в ответ, я приму его. Похоже, ты избил хоробу до удара. –

+2

Спасибо, но, пожалуйста, примите ответ от Choroba. Я не в конкурсе :) –

ответ

7

Вот почему Data::Diver существует:

#!/usr/bin/perl 
use warnings; 
use strict; 

use Data::Diver qw{ Dive }; 

my $hash = { a => { b => { z => 'HERE' } } }; 

my @foo = qw(a b z); 

print Dive($hash, @foo); 
+0

Спасибо. Думал, что должно быть что-то, но не смог найти поисковый запрос Google, который не возвращал родовые результаты. –

+0

'Dive ($ hash, map \ $ _, @foo)' будет более безопасным (т. Е. Будет обрабатывать числовые ключи). – ikegami

Смежные вопросы