如果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结束。
答案 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'}
}
}
}