Неизвестный хэш хэшей хэшей - PullRequest
0 голосов
/ 04 октября 2018

Я могу получить данные из базы данных с помощью следующего кода Perl:

my %hash = $vars->getVarHash;   #load data into a hash
print Dumper(\%hash);

Вывод Dumper выглядит следующим образом:

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

Теперь я знаю, что это хэш-точкина хеш переменных, и каждая из них указывает на список опций для каждой переменной (я предполагаю «хеш хэшей»), например:

HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...

Как мне правильноразыменовать этот хеш, чтобы я мог получить значения переменных, и каждый из них является опциями?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Я не уверен, где определено getVarHash(), но (как говорили другие) похоже, что оно возвращает ссылку на хеш, а не хеш, как вы предполагаете.

Вы можете сохранитьвернул ссылку на хеш в скаляре и использовал ее как ссылку:

my $hash = $vars->getVarHash;
print Dumper($hash);

Это, вероятно, лучший подход, но у него есть один недостаток.Если у вас есть код, который обращается к вашему хешу:

say $hash{foo}; # or whatever

Тогда вам нужно будет переписать его, чтобы вместо этого использовать ссылку на хеш:

say $hash->{foo}; # or whatever

Альтернативный подход заключается в разыменовании значениякоторый возвращается из метода, так что вы можете использовать его в качестве хэша.

my %hash = %{ $vars->getVarHash };

Таким образом, весь ваш код будет работать, как и ожидалось, без внесения изменений.

0 голосов
/ 04 октября 2018

Основная проблема в том, что вы можете только разыменовать ссылки.Хеш не является ссылкой, поэтому «разыменование хэша» не имеет смысла.

Ваш вывод дампа,

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

не показывает вложенную структуру данных или ссылку или что-либо еще,Это буквально одноэлементный хеш, ключ которого (единственный) является строкой "HASH(0x55948e0b06b0)", а значение undef.Вы ничего не можете сделать с этой структурой.

Вероятно, произошло то, что getVarHash возвращает ссылку на хеш (одно значение), который (присваивая хешу) вы неявно преобразовали включ, соответствующее значение которого undef.Хэш-ключи всегда являются строками, поэтому исходное значение ссылки было потеряно.

Perl может рассказать вам об этой конкретной проблеме.Вы всегда должны начинать свои Perl-файлы с

use strict;
use warnings;

Предупреждение для этой конкретной ошибки:

Reference found where even-sized list expected at foo.pl line 123.

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

my $hash = $vars->getVarHash;
print Dumper($hash);

Затем вы можете использовать все обычные методы (как описано, например, perldoc perlreftut) для разыменования его и доступа к его содержимому, например keys %$hash, $hash->{$key} и т. Д..

...