I slightly modified my
script:
#!/usr/bin/perl
use feature 'say';
use warnings;
use strict;
my $file = 'words.txt';
open my $IN, '<', $file or die "$!";
my %words;
while (my $word = <$IN>) {
chomp $word;
undef $words{$word};
}
my %reported;
for my $word (keys %words) {
my $length = length $word;
for my $pos (0 .. $length - 1) {
my $skip_itself = ! $pos;
for my $len (1 .. $length - $pos - $skip_itself) {
my $subword = substr($word, $pos, $len);
next if exists $reported{$subword};
next if $word eq $subword . q{s}
or $word eq $subword . q{'s};
if (exists $words{$subword}) {
say "$subword";
undef $reported{$subword};
}
}
}
}
I used
english.0 from this archive as words.txt:
http://downloads.sourceforge.net/wordlist/ispell-enwl-3.1.20.zip. Your script took 58s, whilest mine only 6s (on Pentium 4, 2.8 GHz).
The results were different, though: your output contains the word
indistinguishableness that mine does not; my list contained 911 more words than yours (e.g.
you,
wraps or
tribe's).