sub match { my $pattern=shift; my $word=shift; ## have to be exact return unless length($pattern) == length($word); my %seen; my @pattern=split //,$pattern; my @word=split //,$word; for my $let (@word) { my $pat=shift @pattern; ## if this is a new pattern, make sure it doesn't ## match a previous letter if (!defined $seen{$pat}) { ## bad if this letter exists return if grep /$let/,join("",values %seen); ## it's OK, $seen{$pat}=$let; } else { ## must be the same return if $seen{$pat} ne $let; } ## tis good } 1; }