我有一个哈希数组哈希的哈希值。我正试图把一些价值拿出去而且我很难过(这比我对结构的要求更深。看起来像这样......
%htest = (
8569 => {
4587 => [
{
date=> "2011-01-15",
approved=> 1,
},
{
date=> "2011-01-12",
approved=> 1,
},
],
1254 => [
{
date=> "2011-01-12",
approved=> "",
},
{
date=> "",
approved=> 1,
},
],
},
);
尝试迭代这件事让我头疼不已。我正在尝试访问第二个哈希值(4587和1254)下的元素数量。批准的元素数量=“1”,日期包含值的元素数量。
如果我可以迭代它们,我相信我可以将我需要的东西推到一个不那么复杂的结构中,但到目前为止我还是处于亏损状态。
我到目前为止......
while (my ($id, $surveyhash) = each %{ $htest{'8569'} } ){
print "$enumid = $subhash\n";
print Dumper $subhash."\n";
}
这给了我“4587”和“1254”,但试图在$ subhash上做一个翻斗车只是给了我......
4587 = ARRAY(0x9a9ffb0)
$VAR1 = 'ARRAY(0x9a9ffb0)
';
1254 = ARRAY(0x9a91788)
$VAR1 = 'ARRAY(0x9a91788)
';
任何想法如何迭代这个怪物? 珍妮
答案 0 :(得分:4)
您的结构有拼写错误,您需要在最里面的哈希值和末尾的括号之间使用逗号(而不是大括号)
修复后,您可以使用以下内容:
my $approved = 0, my $date_has_value = 0;
while ( my ($k,$vref) = each %htest ) {
while ( my ($k,$v) = each %$vref ) {
# Now you're inside the inner hash, so there will be 2 iterations
# with $k 4587 and 1254
foreach my $item (@$v) {
# Now each $item is a reference to the innermost hashes
$approved++ if $item->{approved} == 1;
$date_has_value++ if $item->{date};
}
}
}
答案 1 :(得分:2)
这是一个相当明确的迭代,应该有助于你开始
my ($num_approved, $num_date) = (0, 0);
# outer hash
while (my ($ka, $va) = each %htest)
{
# inner hash
while (my ($kb, $vb) = each %{$va})
{
# each hash inside the array
foreach my $h (@{$vb})
{
$num_approved += ${$h}{"approved"} == 1;
$num_date += length(${$h}{"date"}) > 0;
}
}
}
答案 2 :(得分:2)
可以使用“标量grep”来计算匹配案例。
my ($approved, $date_has_value) = (0, 0);
for my $v1 (values %htest) {
for my $v2 (values %$v1) {
$approved += scalar grep { $$_{approved} eq '1' } @$v2;
$date_has_value += scalar grep { $$_{date} ne '' } @$v2;
}
}