繁体   English   中英

从Perl哈希中的一维获取所有值

[英]Get all values from one dimension in a Perl hash

我有一个像这样构建的哈希:

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

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

首先,无需在递增哈希元素之前检查它是否存在。 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} };

您必须总结每种类型的值。 您可以使用现有循环来完成

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM