my %piles; for (@unsorted_filenames) { push @{$piles{substr($_, 0, 3)}), $_; } my @result; for (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)) { push @result, sort @{$piles{$_}}; delete $piles{$_}; } die if keys %piles; # unexpected prefix!