note
blakem
I did a similar thing once upon a time. Instead of writing one regex to match the wordmask, I calculated the wordmask for each dictionary word and compared it to the given word.
Its probably less efficient than your approach, but it was
easier to write.
<p>
Since <code>wordmask()</code> is a non-trivial subroutine I've included a few tests for it...
<p>
Run it like so:
<blockquote>
% match_word.pl abcdee<br>
% match_word.pl elephant<br>
% match_word.pl run_tests<br>
</blockquote>
<code>
#!/usr/bin/perl -wT
use strict;
my $word = shift || 'abcdee';
my $dict = '/usr/dict/words';
run_tests() if $word eq 'run_tests';
my $mask = wordmask($word);
open(my $in, '<', $dict) or die "cant open $dict : $!";
while(<$in>) {
chomp;
next unless length($_) eq length($mask);
my $wordmask = wordmask($_);
print "$_\n" if $wordmask eq $mask;
}
sub wordmask {
my $word = shift;
$word =~ tr/a-z/A-Z/;
return 'ERROR' unless $word =~ /^[A-Z]+$/;
my $letter = 'a';
while ($word =~ /([A-Z])/) {
$word =~ s/$1/$letter/g;
$letter++;
}
return $word;
}
sub run_tests {
eval "use Test::More tests => 4";
is( wordmask('abc'), 'abc' );
is( wordmask('ally'), 'abbc' );
is( wordmask('ggl'), 'aab' );
is( wordmask('*()'), 'ERROR' );
exit;
}
</code>
<P>
-Blake
269975
269975