как посчитать повторяющиеся значения массива с помощью хэш-ссылки - PullRequest
0 голосов
/ 05 апреля 2019

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

while(my $line=<$fh>) {

                    $timestamp = $1 if $line=~ /^\s*<timestamp>(.*)</;
                    $timestamp =~ s/^(\d\d\d\d-\d\d-\d\d)T.*\s*$/$1/;
                    $errorCode= $1 if $line=~ /^\s*<errorCode>(.*)</;

                    $hash{$timestamp}             = {} unless($hash{$timestamp});
                    $hash{$timestamp}{$errorCode} = [] unless($hash{$timestamp}{$errorCode});

                                    push @{$hash{$timestamp}{$errorCode}}, $1 if $line =~ /<errorText>(.*)</;
            }

выход

   '2019-04-05' => {    '5005' => [
                                    'Dies ist kein aktives Konto',
                                    'Dies ist kein aktives Konto'
                                  ],
                        '7112' => [
                                    'Eingabefelder nicht richtig gefuellt.',
                                    'Eingabefelder nicht richtig gefuellt.',
                                    'Eingabefelder nicht richtig gefuellt.'
                                  ],
                   }

Я бы хотел получить что-то вроде этого:

'2019-04-05' => {    '5005' => { 'Dies ist kein aktives Konto' => 2 },
                     '7112' => { 'Eingabefelder nicht richtig gefuellt.' => 3 },
                }

Может ли кто-нибудь помочь мне с этим? Заранее спасибо.

1 Ответ

3 голосов
/ 05 апреля 2019

Вы можете просто сделать

while (my $line=<$fh>) {
    $timestamp = $1 if $line=~ /^\s*<timestamp>(.*)</;
    $timestamp =~ s/^(\d\d\d\d-\d\d-\d\d)T.*$/$1/;
    $errorCode= $1 if $line=~ /^\s*<errorCode>(.*)</;

    $hash{$timestamp}{$errorCode}{$1}++ if $line =~ /<errorText>(.*)</;
}

Нет необходимости проверять наличие промежуточных структур и создавать их вручную. Об этом позаботится автовивификация.

Просто добавьте еще один слой доступа к хеш-ключам и увеличьте значение. Вы получите число значений.

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