Преобразовать массив в многомерный хеш - PullRequest
0 голосов
/ 21 февраля 2019

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

Пример:

use Data::Dumper;
my $arr = [
    {
        'source' => 'source1',
        'group'  => 'group1',
        'param'  => 'prm1',
        'value'  => 1,
    },
    {
        'source' => 'source1',
        'group'  => 'group1',
        'param'  => 'prm2',
        'value'  => 2,
    },
];


my $res;
for my $i (@$arr) {
    $res->{ $i->{source} }                               = {};
    $res->{ $i->{source} }{ $i->{group} }                = {};
    $res->{ $i->{source} }{ $i->{group} }{ $i->{param} } = $i->{value};
}
warn Dumper $res;

my $res_expected = {
    'source1' => {
        'group1' => {
            'prm1' => 1,  # wasn't added, why ?
            'prm2' => 2
        }
    }
};

Однако он не работает должным образом, 'prm1' => 1 не был добавлен.Что не так и как решить эту задачу?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Проблема в том, что вы назначаете источник, даже если что-то там было, и вы его теряете.Просто сделайте ||= вместо =, и все будет в порядке.

Или даже проще, просто используйте тот факт, что Perl автоматически оживляет, и оставьте это без внимания.

my $res;
for my $i (@$arr) {
    $res->{ $i->{source} }{ $i->{group} }{ $i->{param} } = $i->{value};
}
warn Dumper $res;
0 голосов
/ 21 февраля 2019

Первые две строки в цикле for и являются причиной вашей проблемы.Они присваивают новую хеш-ссылку каждой итерации цикла (и стирают то, что было введено в предыдущей итерации).В Perl нет необходимости устанавливать ссылку, как вы это сделали.Просто удалите первые 2 строки, и ваша структура данных будет соответствовать вашему желанию.

Выбранный вами метод показывает только 'prmt' => 2, потому что это был последний введенный элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...