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浏览这些节点:
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浏览这些节点:
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