在Perl中访问数组的哈希值



我希望访问以下数据:

$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]访问。代码出了什么问题?

您必须首先对foreach循环解引用数组,然后对hashref解引用以获得"Name"值。

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

你应该先阅读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 = $key1n";
    while (my ($key2, $val2) = each %$val1) {
        print "t$key2 = $key2n";
        foreach my $val3 (@$val2) {
            while (my ($key4, $val4) = each %$val3) {
                print "tt$key4 = $key4 => $val4n";
            }
            print "n";
        }
    }
}

[编辑我回答的时候打字太慢了,所以这个回答基本上重复了@mpapec的下面-我会把参考资料留在这里,你可以为我投票;-)但是接受我的回答作为答案]。


试试下面的代码看看是否有效:

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

,因为您需要从数组元素内部获取内部哈希值(这就是value:ARRAY(OXXX)告诉您的)。

您可以使用perldoc查看perldata, perlref, perlreftutperldsc pod ,以了解更多关于数据结构和解引用的信息。如果在编写代码时记住数据结构太难了,这可能意味着您需要简化一些事情:要么是数据本身,要么通过编写sub使其更容易访问,或者使use成为CPAN中一些优秀的实用程序模块。

也有一些很好的perl数据结构相关教程。perl附带的POD/perldoc文档(与perl编程第9章一起)是规范参考,但您可以从perlmonks:

浏览这些节点:
  • 参考资料快速参考
  • 高级数据结构中的引用perl数据结构可视化
  • Perlmonks Hash教程

NB上面我使用perlcritic和Perl最佳实践风格的解引用:例如。: @{ $data1->{Family}{House} }所以语法提醒我内部哈希(或inner-inner?)在数组内。perl 5.20中引入了一种很酷的解引用新方法,称为后缀解引用,这将非常棒,但是遵循PBP的建议不会出错。

"直到你开始用哈希来思考,你才真正在用Perl来思考。"——拉里·沃尔

欢呼,

最新更新