Используйте Хэш Массивов Хэшей как Счетчик - PullRequest
0 голосов
/ 25 мая 2018

Попытка разобрать массив с общими элементами, чтобы создать новый хеш, содержащий информацию о количестве.Структура, которую я пытаюсь создать, выглядит следующим образом:

{
    var1 => [
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],
    var2 => [
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]
}

Я знаю, как создать хэш массивов, но я не могу понять, как внутренний массив представляет хэш счетчиков.как указано выше.У меня есть структура данных, представляющая собой массив массивов с большим количеством элементов.Но, в качестве игрушечного примера, вот что я пытаюсь работать:

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

use Data::Dump;

my @array = (
    ["cat1", "var1"],
    ["cat2", "var1"],
    ["cat2", "var1"],
    ["cat2", "var2"],
    ["cat1", "var1"],
    ["cat1", "var1"],
);

my %counts;
for my $elem (@array) {
    push(@{$counts{$elem->[1]}}, $elem->[0]);
}
dd \%counts;

Я не могу понять, как изменить этот вызов push() для передачи анонимного массива с счетчиками, полученными изцикл по @array (плохое имя, я знаю ... только для демонстрационных целей).

Я думаю, я могу сделать это в два этапа.Но, похоже, должен быть простой способ подсчитать элементы, когда я загружаю их в %counts.Может кто-нибудь показать мне, где я иду не так?

1 Ответ

0 голосов
/ 25 мая 2018

Ваша ожидаемая структура данных имеет недостатки.Вам нужна ссылка на хэш на втором уровне.

{
    var1 => [       # {
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],              # }
    var2 => [       # {
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]               # }
}

С массивом у вас не может быть правильных пар ключ / значение, и просто получается упорядоченный список.

Как только вы используетехэш, вы можете просто использовать var в качестве первого ключа и считать кошек внутри.Там нет необходимости push что-нибудь в любом месте.Perl's autovivification позаботится о создании всего для вас.

my %counts;
foreach my $elem (@array) {
    #        var             cat 
    $counts{ $elem->[1] }->{ $elem->[0] }++;
}

Вывод:

{
    var1   {
        cat1   3,
        cat2   2
    },
    var2   {
        cat2   1
    }
}

Посмотрите на perldsc , perlref и perlreftut для получения дополнительной информации.

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