Perl中数组散列的访问

Perl中数组散列的访问,perl,reference,hashtable,Perl,Reference,Hashtable,我希望访问以下数据: $data1= {'Family' => { 'House' => [ { 'Id' => '1111', 'Name' => 'DFG' }, { 'Id' => '211', 'Name' => 'ABC' } ]

我希望访问以下数据:

$data1=   
{'Family' => {
    'House' => [
        {
            'Id' => '1111',
            'Name' => 'DFG'
        },
        {
            'Id' => '211',
            'Name' => 'ABC'
        }
               ]
            }
}
我想访问“每个名称”字段值。我正在使用以下代码:

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和value:ARRAY(OXXX)


我知道我做错了什么。由于“House”中的数据是一个散列数组,我甚至尝试通过
$data1->{$\u}->{$inner\ukey}[0]
进行访问。代码中有什么错误?

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


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

您应该先阅读以了解如何创建和使用引用

下面是一个演示:

#!/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";
        }
    }
}
您应该先阅读以了解如何创建和使用引用

下面是一个演示:

#!/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";
        }
    }
}

[编辑我在回答时键入的速度太慢,因此此回复基本上重复了下面的@mpapec-我将在这里留下参考资料,您可以投票支持我;-)但是不要接受我的回复作为答案]


尝试以下方法以查看其是否有效:

for $inner_hash (@{ $data1->{Family}{House} }) { 
   say "Name: $inner_hash->{Name}" 
   }
因为您需要从数组元素内部获取内部哈希值(这就是
value:array(OXXX)
告诉您的)

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

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

NB上面我使用了
perlcritic
和去引用的风格:例如:
{$data1->{Family}{House}}
因此语法提醒我内部哈希(或内部-internal?)在数组中。在perl 5.20中引入了一种很酷的新的去引用方法,称为“这将很好”,但遵循PBP的建议是不会出错的

“除非你开始用散列来思考,否则你并不是真的在用Perl来思考。”——拉里·沃尔


干杯,

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


尝试以下方法以查看其是否有效:

for $inner_hash (@{ $data1->{Family}{House} }) { 
   say "Name: $inner_hash->{Name}" 
   }
因为您需要从数组元素内部获取内部哈希值(这就是
value:array(OXXX)
告诉您的)

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

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

NB上面我使用了
perlcritic
和去引用的风格:例如:
{$data1->{Family}{House}}
因此语法提醒我内部哈希(或内部-internal?)在数组中。在perl 5.20中引入了一种很酷的新的去引用方法,称为“这将很好”,但遵循PBP的建议是不会出错的

“除非你开始用散列来思考,否则你并不是真的在用Perl来思考。”——拉里·沃尔


干杯,

我应该按“重新加载”。我的回答几乎和你的一样。删除它。实际上,我会留下它并添加“供进一步参考”的材料,而不是说它不应该被接受。我应该按重新加载。我的回答几乎和你的一样。删除它。实际上,我会留下它并添加“供进一步参考”的材料,而不是说它不应该被接受。你似乎有一个散列数组的散列(?!我看对了吗?)所以类似这样的东西:
对于$inner_散列(@{$data1->{Family}{House}){say“Name:$innerhash->{Name}}
需要进入(也称为a.a。作为一个旁注,这个数据结构浪费了哈希的所有好处,你可以用数组替换它,而不丢失任何功能。考虑<代码> $DATA1-> {家族}{HON}{ 1111 } =“DFG”< /Cord>假设你的ID或名称是唯一的。你似乎有散列数组散列的散列。(?!我看对了吗?)所以类似于:
对于$inner_hash(@{$data1->{Family}{House}}){说“Name:$innerhash->{Name}”}
需要进入(又称“去引用”)作为一个旁注,这个数据结构浪费了哈希的所有好处,你可以用数组替换它而不丢失任何功能。考虑<代码> $DATA1-> {族}{Hoe}{ 1111 } =“DFG”。“假设您的ID或名称是唯一的。您忘记了链接的
$innerhash
中的下划线,但是+1。修复了此问题,谢谢-我尝试使用PBP策略选择变量名称。否则,我会将其命名为$ihsh:-)–您忘记了
$innerhash