use Time::HiRes; $file = "index.sense"; print STDOUT "Please type the word you are attempting to find and press return:\n"; $word = ; chomp($word); $pattern = "^" . $word . "%[^%]*\$"; $time_s = Time::HiRes::time(); (-e $file) or die "You need to download $file first\n"; $line = `grep $pattern $file`; chomp($line); if($line ne ""){ print STDOUT "Word $word found.\n"; } else{ %alternatives = (); print STDOUT "Alternatives are:\n"; # Letter wrong if(wrong_letter($word) == 0){ } # Length of word wrong - should be shorter if(word_shorter($word) == 0){ } # Length of word wrong - should be longer if(word_longer($word) == 0){ } } $time_e = Time::HiRes::time(); print STDOUT "Time taken: " . ($time_e - $time_s) . "s\n"; sub print_new_alternatives { my ($line, $new, $w, @ws); (scalar(@_) == 1) or die "print_new_alternatives: line\n"; $line = $_[0]; @ws = split(/\n/, $line); foreach $w (@ws){ ($w =~ /^(.+)%[^%]*$/) or die "Unexpected WN output: $w\n"; $new = $1; if(!(defined($alternative{$new}))){ $alternative{$new} = 1; print "$new\n"; } } } sub word_longer { my ($i, $line, $pattern, $word); (scalar(@_) == 1) or die "wrong_letter: word\n"; $word = $_[0]; for($i = 0; $i < length($word); $i++){ $pattern = substr($word, 0, $i); $pattern = $pattern . "."; $pattern = $pattern . substr($word, $i, length($word)); $pattern = "^" . $pattern . "%[^%]*\$"; $line = `grep $pattern $file`; chomp($line); if($line ne ""){ print_new_alternatives($line); } } # Or extra character at the end $pattern = "^" . $word . ".%[^%]*\$"; $line = `grep $pattern $file`; chomp($line); if($line ne ""){ print_new_alternatives($line); } return 1; } sub word_shorter { my ($i, $line, $pattern, $word); (scalar(@_) == 1) or die "wrong_letter: word\n"; $word = $_[0]; for($i = 0; $i < length($word); $i++){ $pattern = substr($word, 0, $i); $pattern = $pattern . substr($word, $i + 1, length($word)); $pattern = "^" . $pattern . "%[^%]*\$"; $line = `grep $pattern $file`; chomp($line); if($line ne ""){ print_new_alternatives($line); } } return 1; } sub wrong_letter { my ($i, $line, $pattern, $word); (scalar(@_) == 1) or die "wrong_letter: word\n"; $word = $_[0]; for($i = 0; $i < length($word); $i++){ $pattern = substr($word, 0, $i); $pattern = $pattern . "."; $pattern = $pattern . substr($word, $i + 1, length($word)); $pattern = "^" . $pattern . "%[^%]*\$"; $line = `grep $pattern $file`; chomp($line); if($line ne ""){ print_new_alternatives($line); } } return 1; }