我有一个这样的哈希:
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é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}
之类的内容,但我不知道语法。有可能吗?
答案 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);