use Algorithm::Loops qw( NestedLoops ); my $i = NestedLoops([ map { [ 0..$#$_ ] } @arr ]); while (my @idx = $i->()) { my @vals = map { $arr[$_][$idx[$_]] } 0..$#idx; print('(', join(',', @idx), ') --> ', join(' ', @vals), "\n"); }