sub make_pattern { my $w = shift; my %seen; $w =~ s{([A-Z])}{ if ($seen{$1}) { "\\$seen{$1}" } else { $seen{$1} = 1 + keys %seen; "(" . join("", map "(?!\\$_)", 1 .. ($seen{$1} - 1)) . ".)" } }ge; return qr/^$w$/si; }