Perl JSON - 在记录结果之前检查值是否存在

时间:2017-12-24 13:46:37

标签: json perl

如果key = tls,dns或http,我正试图从以下json输出中提取doc_count值。

JSON:https://pastebin.com/T5Cu3w79

到目前为止,我已经尝试打印出“key”的值,但我无法让它返回结果。 $ hash是存储为数组的JSON输出。

my @buckets = @{ $hash->{'buckets'} };
foreach my $proto (@buckets) {
    print $proto->{"key"} . "\n";
}

编辑:请在此处查看JSON文件:https://pastebin.com/T5Cu3w79。我想要的信息是“key”和“doc_count”值,从第818行开始,到859结束。

2 个答案:

答案 0 :(得分:0)

鉴于你的最后一句话,这似乎可以满足你的需要。

use strict;
use warnings;

use List::Util qw( sum );
# Existing code to build the hash with buckets ...
my @buckets = @{ $hash->{buckets} };
my %count_keys = (
        tls => 1,
        dns => 1,
        http => 1,
    ); # lookup: which keys do I count
my %doc_count;

for my $proto ( @buckets ){
    my $key = $proto->{key};
    next unless $count_keys{ $key }; # not to be counted: skip this
    $doc_count{ $key }+= $proto->{doc_count}; # counting per type
}

print "$_: $doc_count{$_}\n" for sort keys(%doc_count); # output count per type
print "overall: " . sum(values(%doc_count)); # count of all doc counts

我不确定是否还有其他问题/问题:你有没有解码过JSON?如果你有更多的代码可以继续下去会更有帮助。

答案 1 :(得分:-1)

鉴于你的pastebin数据结构(看起来实际上是一个解码的JSON结构),你可以使用它的散列键来访问你在第818行开始指定的“buckets”数组:

my $buckets = $hash->{'spi'}->{'prot-term'}->{'buckets'}; 
for my $proto (@$buckets) {
    # access proto->{'key'}, $proto->{'doc_count'}
} 

如果您想要所有“桶”数组,假设“桶”数组始终位于$hash的第三级

for my $l1 (keys %$hash) {
    for my $l2 (keys %{$hash->{$l1}}) {
        my $buckets = $hash->{$l1}->{$l2}->{'buckets'};
        for my $proto (@$buckets) {
            # $proto->{'key'}, $proto->{'doc_count'}
        }
    }
}