Как получить фрагмент хеша из хеша хэшей?
-
21-09-2019 - |
Вопрос
У меня есть такой хэш:
my %h = ( a => { one => 1,
two => 2
},
b => { three => 3,
four => 4
},
c => { five => 5,
six => 6
}
);
print join(',', @{$h{a}{qw/one two/}});
Я получаю следующую ошибку:Не могу использовать неопределенное значение в качестве ссылки на массив в Q.pl Line 17, которая является линией с печати.
Я ожидал 1,2
Решение
Чтобы получить фрагмент хеша из вложенного хэша, вам необходимо поэтапно отменить ссылку на него.Вы получаете первый уровень, который вам нужен:
$h{'a'}
Теперь вам нужно разыменовать это как хеш.Однако, поскольку это не простой скаляр, его необходимо поместить в фигурные скобки.Чтобы получить весь хеш, вы должны поместить %
перед брекетами:
%{ $h{'a'} }
Теперь вам нужен фрагмент, поэтому вы заменяете %
с @
, поскольку вы получаете несколько элементов и, как обычно, помещаете свои ключи в конце:
@{ $h{'a'} }{ @keys }
Возможно, будет проще увидеть фигурные скобки отдельно:
@{ }{ }
$h{'a'} @keys
Чтобы сделать это проще, в версии 5.20 появился разыменование постфикса.Вместо того, чтобы заключать что-то в фигурные скобки и работать изнутри наружу, вы можете работать слева направо:
$h{a}->@{qw/one two/};
Что @
это то же самое, что вы видели перед первой скобкой.Вы по-прежнему знаете, что это фрагмент хэша, потому что за сигилой стоит фигурная скобка.
Другие советы
пытаться
print join(',',@{$h{'a'}}{qw/one two/});
использование Data::Dumper очень помогает в подобных случаях