从Perl哈希

时间:2016-08-24 08:41:39

标签: perl associative-array

我有一个这样的哈希:

my %datavalue2;

foreach my $alert ( @{ $data } ) {

    my @date = split(/ /,$alert->{logged});

    $status = $alert->{status}->{status};
    $type   = $alert->{type};

    if  ( ! defined $datavalue2{$date[0]}{$type}{$status} ) {
        # print "initialisation de la variable du ".$date[0]." de type ".$type." avec le status ".$status."<br>";
        $datavalue2{$date[0]}{$type}{$status}=1;
    }
    else {
        # print "incr&eacute;mentation de la variable du ".$date[0]." de type ".$type." avec le status ".$status."<br>";
        $datavalue2{$date[0]}{$type}{$status} +=1;
    }

    # print "<br> ";
}

如何获得一个日期和每种类型的所有$status=1的总和?

我想要$total_type1 += $datavalue2{2016-08-15}{*}{1}之类的内容,但我不知道语法。有可能吗?

2 个答案:

答案 0 :(得分:1)

请注意 此代码均未经过测试 ,因为我目前只有平板电脑可供使用

首先,在递增哈希元素之前无需检查哈希元素是否存在。 Perl将根据需要自动生成元素,因此您可以像这样编写代码

my %datavalue2;

for my $alert ( @$data ) {

    my @date = split ' ', $alert->{logged};

    $status = $alert->{status}{status};
    $type   = $alert->{type};

    ++$datavalue2{$date[0]}{$type}{$status};
}

您的数据结构不适合做您要求的事情,您可能最好重新设计它。但你想要的肯定是可能的

my $date = '2016-08-15';
my $total_status1 = 0;

$total_status1 += $_->{1} // 0 for values %{  $datavalue{$date} };

答案 1 :(得分:0)

您必须总结每种类型的值。要么使用现有的循环

my %datavalue2;
my %totalsPerStatus;
foreach my $alert ( @{ $data } )
{
   ...
   $totalsPerStatus{$date[0]}{$status} //= 0; # initialize total per status
   $totalsPerStatus{$date[0]}{$status}++; # increment total
}

$total_type1 += $totalsPerStatus{'2016-08-15'}{1};

......或之后......

sub getTotalPerStatus {
    my ($datavalue2, $date, $status) = @_;

    $total = 0;
    foreach my $type (keys %{$datavalue2->{$date}}) {
        if (exists $datavalue2->{$date}->{$type}->{$status}) {
            $total += $datavalue2->{$date}->{$type}->{$status} 
        }
    }
    return $total;
}

$total_type1 += getTotalPerStatus(\%datavalue2, '2016-08-15', 1);