use Algorithm::Permute; my @patterns = (); my $p = new Algorithm::Permute(['X', 'Y', 'Z']); while (@res = $p->next) { push @patterns, join('', @res); } my $pattern = join '|', @patterns; print "$pattern\n"; # give the pattern a test... while () { chomp; print "$_ is ", /^(?:$pattern)$/ ? 'good' : 'bad', "\n"; } __DATA__ XYX XYZ ZYY ZXY ZYX XXYZ #### ZYX|YZX|YXZ|ZXY|XZY|XYZ XYX is bad XYZ is good ZYY is bad ZXY is good ZYX is good XXYZ is bad