use strict; use warnings; use Data::Dump; my %values; map{ $values{$_} = 1} qw(e a i o n r t l s u); map{ $values{$_} = 2} qw(d g); map{ $values{$_} = 3} qw(b c m p); map{ $values{$_} = 4} qw(f h v w y); map{ $values{$_} = 5} qw(k); map{ $values{$_} = 8} qw(j x); map{ $values{$_} = 10} qw(q z); # result words from tybalt89 example my @result_words = qw(along gall gallon goal hall halo halon hang hogan llano loan loll long); my %scores = words_values(@result_words); foreach my $word ( sort{ $scores{$b} <=> $scores{$a} } keys %scores ){ print "$word\tscore:\t$scores{$word}\n"; } sub words_values{ my @words = @_; my %scores = map { my $word = $_; my @chars = split '', $word; my $score; $score += $values{$_} for @chars; $word => $score; } @words; return %scores; } __DATA__ hogan score: 9 hang score: 8 halon score: 8 halo score: 7 gallon score: 7 hall score: 7 along score: 6 llano score: 5 goal score: 5 gall score: 5 long score: 5 loll score: 4 loan score: 4