1

API から返されたデータにアクセスしようとしていますが、配列から正しい値を取得できません。Dumper が問題なく画面に出力できるため、API がデータを返していることはわかっています。

配列に関するすべての情報を印刷しようとすると、何を印刷するかが正確にわかります。ハッシュを受け取っているだけです。これが混乱している場合は申し訳ありませんが、まだ学習中です。

次のコードを使用すると、以下の出力が得られます。

foreach my $hash (@{$res->data}) {
  foreach my $key (keys %{$hash}) {
    print $key, " -> ", $hash->{$key}, "\n";
  } 
}

出力

stat -> HASH(0xf6d7a0)
gen_info -> HASH(0xb66990)

上記を変更してハッシュをトラバースする方法を知っている人はいますか?

私がやろうとしていることの要点は、配列の特定の値を出力することです。

私の配列のダンパーを見てください。

print Dumper(\$res->data);

http://pastebin.com/raw.php?i=1deJZX2f

印刷しようとしているデータは guid フィールドです。

私はそれが何かのようになるだろうと思った

print $res->data->[1]->{guid}

しかし、これはうまくいかないようです。ここで何かが欠けているだけで、必要以上に考えていると確信しています。それは素晴らしいだろう間違っている

ありがとうございました

4

2 に答える 2

2

ハッシュにハッシュがある場合は、これを試すことができます

foreach my $hash (@{$res->data}) {

    foreach my $key (keys %{$hash}) {

        my $innerhash = $hash->{$key};

        print $key . " -> " . $hash . "\n";

        foreach my $innerkey (keys %{$innerhash}) {

            print $key. " -> " . $innerhash->{$innerkey}. "\n";

        } 
    } 
 }
于 2013-07-31T05:35:40.803 に答える
1

あなたが持っている構造は、ハッシュのハッシュの配列です。これは、ダンプに次のように表示されます。

# first hash with key being 'stat', 
#     Second hash as keys (traffic, mail_resps...) followed by values (=> 0)
'stat' => {
            'traffic' => '0', . 
            'mail_resps' => '0',

したがって、最初のハッシュのキーの値は、ハッシュまたはハッシュのハッシュです。

すべての要素を出力したい場合は、2 番目のハッシュのキーのループを追加する必要があります。

foreach my $hash (@{$res->data}) {  # For each item in the array/list
  foreach my $key (keys %{$hash}) {  # Get the keys for the first hash (stat,gen_info)
    foreach my $secondKey ( keys %{$hash->{$key}}) # Get the keys for the second hash
    {
      print $key, " -> ", $secondKey, " -> ",${$hash->{$key}}{$secondKey}, "\n";
    }
  } 
}

GUID だけに興味がある場合は、次のようにアクセスします。

$res->data->[1]->{gen_info}{guid} 

ここで、gen_info は最初のハッシュのキーで、guid は 2 番目のハッシュのキーです

exit を使用してアクセスする前に、キーが最初と 2 番目のハッシュに存在するかどうかを確認できます。

$n = 1 # Index of the array you want to get the information 
if (( exists $res->data->[$n]->{gen_info} )  &&    # Check for the keys to exists in 
    ( exists $res->data->[$n]->{gen_info}{guid} )) # in each hash
{
   # do what you need to 
}
else
{
  print "ERROR: either gen_info or guid does not exist\n";
}
于 2013-07-31T05:40:42.007 に答える