我希望访问以下数据:
$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]
访问。代码有什么问题???
答案 0 :(得分:3)
您必须首先取消引用foreach循环的数组,然后取消引用hashref以达到“Name”值。
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
查看perldata
,perlref
,perlreftut
和perldsc
POD 以了解详情数据结构和解除引用。如果在编写代码时记住数据结构变得过于困难,可能意味着您需要简化操作:数据本身或编写sub
以使其更容易从CPAN访问或制作use
一些优秀的实用程序模块。
还有一些很好的perl数据结构相关教程。 perl附带的POD / perldoc文档(以及Programming Perl的第9章)是规范参考,但您可以从perlmonks浏览这些节点:
NB 以上我使用perlcritic
和Perl Best Practices解除引用的方式:例如: @{ $data1->{Family}{House} }
所以语法提醒我内部哈希(或内部内部?)在数组中。在perl 5.20中引入了一种很酷的新解除引用方式,名为postfix dereferencing,这将很棒,但根据 PBP 的推荐,您可能会出错。
"在你开始考虑哈希之前,你并不是在用Perl思考。" - 拉里·沃尔
干杯,