在Perl中访问Array的散列哈希值

时间:2014-05-01 17:04:49

标签: perl reference hashtable

我希望访问以下数据:

$data1=   
{'Family' => {
    'House' => [
        {
            'Id' => '1111',
            'Name' => 'DFG'
        },
        {
            'Id' => '211',
            'Name' => 'ABC'
        }
               ]
            }
}

我想访问每个Name字段值。我正在使用此代码:

foreach(keys%$data1) {

    if(ref($data1->{$_}) eq 'HASH') {

        foreach my $inner_key (keys%{$data1->{$_}})    {

            print "Key:$inner_key and value:$data1->{$_}->{$inner_key}\n";   
        }
    } 
    else {

            print "Key: $_ and Value: $data1->{$_}\n"
    } 
}

打印Key:House and value:ARRAY(OXXX)

我知道我做错了什么。由于'House'中的数据是一个哈希数组,我甚至尝试通过$data1->{$_}->{$inner_key}[0]访问。代码有什么问题???

3 个答案:

答案 0 :(得分:3)

您必须首先取消引用foreach循环的数组,然后取消引用hashref以达到“Na​​me”值。

print "Key:$inner_key and value:$_->{Name}\n" 
  for @{$data1->{$_}->{$inner_key}};

答案 1 :(得分:2)

您应首先阅读perlref以了解如何创建和使用参考文献。

这是一个演示:

#!/usr/bin/perl

use strict;
use warnings;

my $data1=   
{'Family' => {
        'House' => [
        {
            'Id' => '1111',
            'Name' => 'DFG'
        },
        {
            'Id' => '211',
            'Name' => 'ABC'
        }
        ]
    }
};

while (my ($key1, $val1) = each %$data1) {
    print "\$key1 = $key1\n";
    while (my ($key2, $val2) = each %$val1) {
        print "\t\$key2 = $key2\n";
        foreach my $val3 (@$val2) {
            while (my ($key4, $val4) = each %$val3) {
                print "\t\t\$key4 = $key4 => $val4\n";
            }
            print "\n";
        }
    }
}

答案 2 :(得分:2)

[编辑我在回答的过程中键入的速度太慢,所以这个回复基本上重复@ mpapec' s - 我会在这里留下参考文献,你可以投票给我那些;-)但是接受我的回复作为答案]。


尝试使用以下内容查看是否有效:

for $inner_hash (@{ $data1->{Family}{House} }) { 
   say "Name: $inner_hash->{Name}" 
   }

因为你需要得到内在的哈希'数组元素内部的值(即value:ARRAY(OXXX)告诉你的)。

您可以使用perldoc查看perldataperlrefperlreftutperldsc POD 以了解详情数据结构和解除引用。如果在编写代码时记住数据结构变得过于困难,可能意味着您需要简化操作:数据本身或编写sub以使其更容易从CPAN访问或制作use一些优秀的实用程序模块。

还有一些很好的perl数据结构相关教程。 perl附带的POD / perldoc文档(以及Programming Perl的第9章)是规范参考,但您可以从perlmonks浏览这些节点:

NB 以上我使用perlcriticPerl Best Practices解除引用的方式:例如: @{ $data1->{Family}{House} }所以语法提醒我内部哈希(或内部内部?)在数组中。在perl 5.20中引入了一种很酷的新解除引用方式,名为postfix dereferencing,这将很棒,但根据 PBP 的推荐,您可能会出错。

"在你开始考虑哈希之前,你并不是在用Perl思考。" - 拉里·沃尔

干杯,