use List::Util qw[sum]; foreach my $track (@$tracks) { my @points = map { @{$_->{points}} } @{ $track->{segments} }; my $count_of_points = @points; my $total_elevation = sum 0, map { $_->{ele} } @points; my $average = $total_elevation / $count_of_points; printf "%s = %d\n", $track->{name}, $average; }