use strict; use warnings; #use Data::Dump qw/pp dd/; # https://perlmonks.org/?node_id=11105802 # data stolen from tybaldt my %score_by_name = ( Alec => 14, Alice => 12, Bob => 8, Donny => 13, Jacob => 13, Mike => 11, Sarah => 13, First => 17 ); # invert %score_by_name to HoA my %names_by_score; while ( my ($name,$score) = each %score_by_name) { push @{$names_by_score{$score}}, $name; } #pp \%names_by_score; my $rank=0; for my $score ( sort {$b <=> $a} keys %names_by_score ) { my @names = @{$names_by_score{$score}}; # calculate ranks my $rank_str = $rank+1; $rank += @names; $rank_str .= "-$rank" if @names >1; # span if necessary # output printf "%3s. %-20s - %2d\n", $rank_str, join (", ",@names), $score; # printf "%3s. (%2d) %s\n", # $rank_str, $score, join (", ",@names); }