unless (exists $cache{$inner}) { $cache{$inner} = 0; $cache{$inner} += $_->{value} for @{ $foo->{$inner} }{@keys}; # This might be a little faster, because perl doesn't have to build the temporary list @{ $foo->{$inner} }{@keys} # $cache{$inner} += $foo->{$inner}{$_}{value} for @keys; } $sum = $cache{$inner};