#!/usr/bin/perl use strict; use warnings; use diagnostics; use open IN => ':utf8'; binmode STDIN, ':utf8'; binmode STDOUT, ':utf8'; my %freq; while (<>) { # reads from STDIN or from all file names in @ARGV $_ = lc(); s/[^a-z'-]+/ /g; for my $word ( split ) { $freq{$word}++; } } for ( sort { $freq{$b} <=> $freq{$a} || $a cmp $b } keys %freq ) { printf "%05d %s\n", $freq{$_}, $_; # or to list results on larger data sets without leading zeros: # printf "%9d %s\n", $freq{$_}, $_; }