use Modern::Perl; #my $alphabet = ['a'..'z', 'A'..'Z']; #my $word_length = 6; my $alphabet = ['a'..'b', '_']; my $word_length = 3; sub create_dictionary { my ($alphabet, $word_length) = @_; my @odometer = (0) x $word_length; my $len_alpha = @$alphabet; my $exhausted = 0; return sub { my $str = undef; if (!$exhausted) { $str = join('', map { $alphabet->[$_] } @odometer); my $add = 1; @odometer = map { $_+=$add; $add = $_ >= $len_alpha ? 1:0; $_% $len_alpha } @odometer; $exhausted = $add; # last carry == 1 => exhausted! } return $str; }; } my $dict = create_dictionary($alphabet, $word_length); while (my $word = $dict->()) { say $word; }