#! perl -slw use strict; use Time::HiRes qw[ time ]; use List::MoreUtils qw[ uniq ]; sub idx{ my $idx = chr(0) x 4; vec( $idx, $_, 1 ) = 1 for map ord()-ord('a'), uniq sort split'', $_[ 0 ]; $idx; } my %idx; open DICT, '<', 'junk.words' or die $!; while( ) { chomp; push @{ $idx{ idx( $_ ) } }, $_; } my @keys = keys %idx; print scalar @keys; while( <> ) { my $start = time; my @matches; my $n = 0; chomp; ( my $pat = $_ ) =~ tr[a-z][]cd; $pat = idx( $pat ); for my $idx ( grep+(($_ & $pat) eq $pat), @keys ) { for my $poss ( @{ $idx{ $idx } } ) { $poss =~ $_ and $matches[ $n++ ] = $poss; } } printf "Found $n matches in %.2f seconds; Display? ", time() - $start; if( <> =~ /y/i ) { print for @matches; } }