如何使用hashreference计算数组的重复值

问题描述 投票:0回答:1

我想计算哈希中数组的值并将它们添加到哈希中。我的代码看起来像这样:

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 },
                }

谁能帮我这个?提前致谢。

perl hash
1个回答
3
投票

你可以这样做

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>(.*)</;
}

无需检查中间结构的存在并手动创建它们。自动化将照顾到这一点。

只需添加另一层散列键访问权限并递增值即可。你最终会得到一个值的数量。

© www.soinside.com 2019 - 2024. All rights reserved.