use strict; use warnings; my @words = qw{bioinfo alpha different}; foreach my $word (@words) { print qq{$word\n}; my $rhRank = rank($word); print qq{$_ -- $rhRank->{$_}\n} for split m{}, $word; } print qq{\n}; sub rank { my $word = shift; my %seen = (); my $index = 0; my $rhRank = { map {$_, ++ $index} sort {$b cmp $a} grep {! $seen{$_} ++} split m{}, $word }; }