从perl数组/哈希打印信息

时间:2013-07-31 05:04:11

标签: arrays perl xml-rpc

我正在尝试访问从api返回的数据,我只是无法从数组中获取正确的值,我知道API正在返回数据,因为Dumper可以在屏幕上打印出来没问题。

当尝试打印有关阵列的所有信息时,我确切地知道要打印的内容,我只是收到一个哈希。对不起,如果这令人困惑,还在学习。

使用以下代码,我得到以下输出,

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

输出

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

你们中的任何人都知道如何修改上述内容以便在HASH中进行遍历吗?

我尝试做的底线是打印出阵列的某个值。

请参阅我的阵列转储器。

print Dumper(\$res->data);

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

我试图打印的数据是guid字段。

我认为它会像

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

但是这似乎不起作用,我确定我只是在这里错过了一些东西并且比我应该更多地思考它,如果有人可以指出我的写作方向或给我写正确的印刷品并解释什么我做错了会很棒

谢谢

2 个答案:

答案 0 :(得分: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";

        } 
    } 
 }

答案 1 :(得分:1)

你拥有的结构是一系列哈希哈希。这在转储中显示为

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

所以第一个哈希中键的值是哈希值或哈希哈希值。

如果要打印出每个元素,则需要为第二个哈希的键添加一个额外的循环。

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是第二个哈希的键

您可以在使用退出

访问之前检查第一个和第二个哈希中是否存在密钥
$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";
}