2017-12-24 11 views
-1

key = tls, dns 또는 http 인 경우 다음 json 출력에서 ​​doc_count 값을 추출하려고합니다.Perl JSON - 결과를 기록하기 전에 값이 존재하는지 확인하십시오.

JSON : https://pastebin.com/T5Cu3w79

지금까지 내가 "키"의 값을 출력하려고 시도했지만 나는 그것이 결과를 반환 할 수 없었다. $ hash는 배열로 저장된 JSON 출력입니다.

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

편집 : https://pastebin.com/T5Cu3w79 : 여기에 JSON 파일을 참조하십시오. 원하는 정보는 "key"와 "doc_count"값이 818 행과 859 행으로 시작됩니다.

+0

코드의 합리적인 금액을 제시하십시오 : 당신은 은 "버킷"배열은 세 번째 수준 $hash에 항상 가정, 모든 "버킷"배열을 원했다. '$ hash '란 무엇입니까? – Borodin

+0

JSON 데이터는'['또는'{'로 시작해야합니다. – Borodin

+1

제목과 예제는 json을 참조하지만 코드는 Perl 데이터 구조를 보여줍니다. 실제로 도움이 필요한 것은 무엇입니까? – ysth

답변

-1

을 감안하여 페이스트 빈 데이터 구조 (실제로는 디코딩 JSON 구조로 보이는), 당신은 라인 (818)에서 시작 지정 "버킷"배열이 같은 해시 키를 사용하여 액세스 할 수 있습니다

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

하는 경우

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'} 
     } 
    } 
} 
+0

이 작품은 고마워요. 나는 "spi"부분을 직접 가지고 있지 않았다. – temp44

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을 디코딩이? 계속 진행할 코드가 더 있으면 도움이 될 것입니다.

+0

솔루션을 전체 프로그램으로 제시했지만 누락 된 부분이 많습니다. – Borodin

+0

나는 이미 예상했던 것을 나타내는 주석을 달고'@ buckets'을 선언했습니다. – bytepusher

+1

감사합니다. 나는 그것이 독립 실행 형 프로그램이 아니라는 것을 강조하기 위해 몇 가지 휴식을 추가했습니다. – Borodin