use warnings; use strict; use Data::Dump; my %data = ( 'car' => 180, 'motorcycle' => 150, 'skate' => 150, 'bird' => 120, ); my @keys = sort { $data{$b} <=> $data{$a} or $a cmp $b } keys %data; my ($prev,$rank); for my $k (@keys) { $rank++ unless defined($prev) && $prev==$data{$k}; dd $k, $data{$k}, $rank; $prev = $data{$k}; } __END__ ("car", 180, 1) ("motorcycle", 150, 2) ("skate", 150, 2) ("bird", 120, 3)