#!/usr/bin/perl use strict; use warnings; use Text::LevenshteinXS; use constant WORD => 0; use constant LEN => 1; use constant MAX => 10_000_000; my @word; while () { tr/\r\n//d; push @word, [$_, 0]; } @word = sort {length($b->[WORD]) <=> length($a->[WORD]) || $a->[WORD] cmp $b->[WORD]} @word; my ($min_word, $min_dist) = ('', MAX); for my $i (0 .. $#word) { next if $word[$i][LEN] >= $min_dist; for my $j (0 .. $#word) { next if $i == $j; my $dist = distance($word[$i][WORD], $word[$j][WORD]); $word[$i][LEN] = $dist if $dist > $word[$i][LEN]; $word[$j][LEN] = $dist if $dist > $word[$j][LEN]; last if $dist >= $min_dist; } ($min_word, $min_dist) = ($word[$i][WORD], $word[$i][LEN]) if $word[$i][LEN] < $min_dist; } for (@word) { # Obviously this would need to be stored my $dist = distance($_, $min_word); } print "$min_word\t$min_dist\n"; __DATA__