my @alpha = ('a'..'c'); my @counter = (); sub get_next { for (@counter) { $_++; last if ($_ <= $#alpha); $_ = 0; } push @counter,0 unless grep($_>0,@counter); return join"",map($alpha[$_],@counter); } for ($_ = get_next();4 > @counter ;$_ = get_next()) { print "$_ "; } __DATA__ output: a b c aa ba ca ab bb cb ac bc cc aaa baa caa aba bba cba aca bca cca aab bab cab abb bbb cbb acb bcb ccb aac bac cac abc bbc cbc acc bcc ccc