Here is a better version. I realized just after I sent it that
@string was unnecessary. Originally I was going to write romanize and
expand in the same function, and I didn't go back and simplify
romanize when I decided to split the functionality into two functions.
Also, I had a useless join in expand due to a possible different
solution (the code worked, but was pointless). This version also
correctly handles being passed an empty string.
#!/usr/bin/perl
use strict;
use warnings;
my %map = (
a => [ qw/ aa ab 12 / ],
e => ['y'],
);
for my $word (qw/ bad bed base attack /, '') {
print "$word =>\n",
map "\t$_\n", expand(romanize($word, \%map));
}
#produce a compact representation of the possible strings
sub romanize {
my ($word, $map) = @_;
return map { [ $map->{$_} ? @{$map->{$_}} : $_ ] } split //, $word;
}
#expand the compact representation into all possible strings
sub expand {
my @string = @_;
my @result;
return "" if @string == 0;
return @{$string[0]} if @string == 1;
for my $char (@{$string[0]}) {
for my $string (expand(@string[1 .. $#string])) {
push @result, "$char$string";
}
}
return @result;
}
--
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/