use Algorithm::Loops qw( NestedLoops ); my $level = 3; my @indices = NestedLoops( [ (['A'..'D']) x $level ], sub { join '', map { "${_}1" } @_ } ); foreach my $val (@indices) { print($val\n") ]