use List::Util qw/min max/; my %results = map { my $year_ref = $data{$_}; my $min = min values %$year_ref; my $max = max values %$year_ref; my @min_months = grep { $year_ref->{$_} == $min } keys %$year_ref; my @max_months = grep { $year_ref->{$_} == $max } keys %$year_ref; $_ => { "min" => $min, "max" => $max, "min_months" => \@min_months, "max_months" => \@max_months } } keys %data;