#! perl -slw use strict; my $spec = shift or die 'No spec supplied!'; my $re = ''; my %tally; my $i = 1; for my $c ( split '', $spec ) { if( exists $tally{ $c } ) { $re .= '\\' . $tally{ $c }; } else { if( $i == 1 ) { $re .= '(.)'; } else { $re .= '(?!' . join( '|', map{ '\\' . $_ } values %tally ) . ')(.)'; } $tally{ $c } = $i++; } } $re = qr[^$re$]; print $re; m[$re] and printf $_ while <>; __END__ C:\test>wordSolver ABCDECFG words (?-xism:^(.)(?!\1)(.)(?!\1|\2)(.)(?!\1|\3|\2)(.)(?!\1|\4|\3|\2)(.)\3(?!\1|\4|\3|\5|\2)(.)(?!\6|\1|\4|\3|\5|\2)(.)$) abednego abscised airborne ... whisking worker's writhing ziegfeld