如何访问存储在散列中的数组元素?
问题描述:
我正在研究一个脚本,并试图从存储在散列中的数组中获取一些值。在Google上搜索之后,在SO上搜索问题(并且有一些类似的标题,但仍未解决或者解决的问题与我的有点不同),并且在检查了Data Structures Cookbook并尝试了所有合理的尝试之后,我来请求你的帮助。如何访问存储在散列中的数组元素?
我有一个散列,$action
,和一个数组,$action->{'Events'}
。下面是输出为print Dumper($action->{'Events'});
:
$VAR1 = [{
'Muted' => 'something',
'Role' => 'something',
'Event' => 'something',
'Channel' => 'something',
'Talking' => 'something',
'UserNumber' => 'somenumber',
'CallerIDName' => 'somenumber',
'Conference' => 'somenumber',
'MarkedUser' => 'something',
'ActionID' => 'somenumber',
'CallerIDNum' => 'somenumber',
'Admin' => 'something'
}];
我需要,例如,$action->{'EVENTS'}->{'CallerIDName'}
价值,但是这句法和许多其他都不行。我甚至试过$action->{'EVENTS'}[6]
和$action->{'EVENTS'}->[6]
等等。
答
这是哈希的数组,试试这个方法:
$action->{'EVENTS'}[0]->{'CallerIDName'}
看到perldsc更多细节。
更新例子,如:
use strict;
use warnings;
use Data::Dumper;
my $action = {};
$action->{'Events'} = [{'Muted' => 'something',
'Role' => 'something',
'Event' => 'something',
'Channel' => 'something',
'Talking' => 'something',
'UserNumber' => 'somenumber',
'CallerIDName' => 'somenumber',
'Conference' => 'somenumber',
'MarkedUser' => 'something',
'ActionID' => 'somenumber',
'CallerIDNum' => 'somenumber',
'Admin' => 'something'}];
#push hash into the array of hashes
push(@{$action->{'Events'}},{'Muted' => 'something',
'Role' => 'something1',
'Event' => 'something1',
'Channel' => 'something1',
'Talking' => 'something1',
'UserNumber' => 'somenumber1',
'CallerIDName' => 'somenumber1',
'Conference' => 'somenumber1',
'MarkedUser' => 'something1',
'ActionID' => 'somenumber1',
'CallerIDNum' => 'somenumber1',
'Admin' => 'something1'});
for(my $i=0; $i < @{$action->{'Events'}}; $i++){
print Dumper($action->{Events}[$i]); #print entire hash in array index $i
#print callerIDName key(any key) of each hash
print Dumper($action->{'Events'}[$i]->{'CallerIDName'});
}
答
你缺少的一个是,$行动包含数组的引用,所以接下来的部分必须取消引用数组。然后在那里是一个散列,你需要解散散列。因此,它应该是这样的:
$action->{'EVENTS'}[0]{'CallerIDname'}
(注意 - >的超越第一是可选的,所以这是好的,以及:
$action->{'EVENTS'}->[0]->{'CallerIDname'}
而且做同样的事情)
答
外部的[]表示散列在数组内。所以请尝试:
$action->{Events}->[0]->{CallerIDName}
您可以省略{Events}和[0]之间的 - >,但为了清晰起见,我更喜欢它。它在这里没有什么不同,但它在其他地方。比较:
@array = (1,2,3);
$arrayref = \@array;
print $arrayref[0]; # accesses non-existent array @arrayref
print $arrayref->[0]; # '1'
这就是它,谢谢! – 2011-03-28 09:17:37
你可以通过提供一种方法来遍历$ action - > {'Events'}中的哈希来进一步帮助我吗? – 2011-03-28 09:35:24
@altvali:查看我更新的答案。 – 2011-03-28 15:38:31