my %counts = ( "Adam" => { "201708" => 1, "201703" => 1, "201804" => 1, "201603" => 1, "201705" => 1, "201702" => 1, "201608" => 1, "201704" => 1,}, "Sam" => { "201803" => 1, "201801" => 1 }, ); use List::UtilsBy 'max_by'; foreach my $key ( keys %counts ) { my $subhash = $counts{$key}; my $maximal = max_by { $subhash->{$_} } keys %$subhash; print "$key, $maximal\n"; } use List::UtilsBy 'min_by'; foreach my $key ( keys %counts ) { my $subhash = $counts{$key}; my $minimal = max_by { $subhash->{$_} } keys %$subhash; print "$key, $minimal\n"; }