2016-08-24 61 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} };