my @d = qw( respect strength ); # yeah, weak dictionary, sue me! my $n = "7377328"; my %a = ( 1=>[], 2=>['a','b','c'], 3=>['d','e','f'], 4=>['g','h','i'], 5=>['j','k','l'], 6=>['m','n','o'], 7=>['p','q','r','s'], 8=>['t','u','v'], 9=>['w','x','y','z'] ); my @r = words( $n, \%a, \@d ); print join ",",@r; print "\n"; sub words{ #234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 my($n,$a,$d,@l,@b,$c,$e)=@_;@b=split//,$n;@a=('');for(@b){$c=$_;@a=map{$e=$_;map{$e.$_}@{$a->{$c}}}@a}; grep{$c=$_;grep{$c eq$_}@$d}@a }