2016-08-24 35 views
0

我建立一个像这样的哈希:获取从一个维度的所有值在一个Perl哈希

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}但我不知道语法。可能吗?

+1

需要一些源数据作为例子,我认为。 – Sobrique

回答

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); 
+0

你不需要初始化,'++'(和autovivify)就是这样隐含的。 – Sobrique

1

注意没有这个代码的测试因为我只有一个平板电脑搭配使用目前

首先,在递增之前不需要检查散列元素是否存在。 Perl将autovivify的元素作为必要的,所以你可以写你这样的代码

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