From my own personal dictionary, including lots of arcane, obsolete, and dubious entries:
Funny how many of these seem to be Germanic in origin.
#!/your/perl/here
# find word with most consecutive vowels and/or consonants
use strict;
use warnings;
# treat y as a vowel, not a consonant
my $VOWELS = qr/([aeiouy]+)/i;
my $CONSONANTS = qr/([b-df-hj-np-tv-xz]+)/i;
my $longest_vowels = {};
my $longest_consonants = {};
while (<>)
{
# only lower case (no proper names)
# only single words
next unless /^[a-z]+$/;
$longest_vowels = find_longest( $_, $VOWELS, $longest_vowe
+ls );
$longest_consonants = find_longest( $_, $CONSONANTS, $longest_cons
+onants );
}
foreach my $record ($longest_vowels, $longest_consonants)
{
my $length = (keys %{$record})[0];
print "($length) ", join( '', sort @{$record->{$length}}), "\n";
}
######################
# given word, regex, and hashref,
# return a hashref with words having the longest consecutive regex mat
+ch
# hash should only have 1 key (longest length run),
# hash value is array of words with "length" run
sub find_longest
{
my $word = shift;
my $regex = shift;
my $previous = shift; # hashref
# only one key should exist
my ($length) = (keys %{$previous})[0] or 0;
# find all matches in the current word
my @matches = $word =~ /$regex/g;
# reverse sort matches by length
@matches = sort { length($b) <=> length($a) } @matches;
foreach my $match ( @matches )
{
# no more interesting matches?
last if ($length > length($match));
# equal length, add to list
if ( $length == length($match) )
{
push @{$previous->{$length}}, $word;
}
else # new length, start new list
{
$length = length($match);
$previous = { $length => [$word] };
}
# uncomment to watch it run
# print STDERR "$regex) ($length) $word";
}
return $previous;
}