2017-12-24 17 views
-1

キー= 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"; 
} 

EDIT:https://pastebin.com/T5Cu3w79のJSONファイルを参照してください。必要な情報は、818行目から859行目までの「key」と「doc_count」の値です。

+0

は、コードの合理的な金額を提示してください:あなたはは「バケット」配列は第3レベル$hashに常にあると仮定すると、すべての「バケット」の配列を望んでいました。 '$ hash'とは何ですか? – Borodin

+0

JSONデータは '['または '{'。 – Borodin

+1

あなたのタイトルと例はjsonを参照していますが、あなたのコードはPerlのデータ構造を示しています。あなたは実際にどちらに助けが必要ですか? – ysth

答えて

-1

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

これは、ありがとう、たくさん働いています。私は自分自身で "スピード"の部分を持っていませんでした。 – 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をデコードしていますか?それ以上のコードがあればはるかに役立つでしょう。あなたペーストビンデータ構造(実際にデコードされたJSON構造になりそうだもの)を考えると、あなたはライン818から始まる指定した「バケット」の配列は次のようにそのハッシュキーを使用してアクセスすることができます

+0

解決策を完全なプログラムとして提示しましたが、欠けている部分がたくさんあります。 – Borodin

+0

私は既に何が起こったのかを示すコメントを入れて、 '@ buckets'を宣言しました – bytepusher

+1

ありがとうございました。私はそれがスタンドアロン機能のプログラムではないことを強調するためにいくつかの休憩を追加しました – Borodin

関連する問題