我希望访问以下数据:
$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)
$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
, perlreftut
和perldsc
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来思考。"——拉里·沃尔
欢呼,