use strict; use warnings; my $dictFile = q{2of12.txt}; open my $dictFH, q{<}, $dictFile or die qq{open: $dictFile: $!\n}; chomp(my @words = <$dictFH>); close $dictFH or die qq{close: $dictFile: $!\n}; my $input = shift; my $charCt = length $input; my %chars; $chars{$_} ++ for split m{}, $input; my $charsWanted = join q{}, map { qq{(?=@{ [ qq{.*$_} x $chars{$_} ] })} } keys %chars; my $wordLength = qq{(?=.{@{ [ length $input ] }}\$)}; my $rxDict = qr{(?x)^$charsWanted$wordLength}; print map { qq{$_\n} } grep { m{$rxDict} } @words;