use Math::Cartesian::Product; # this encodes the number of loops and their ranges my @ranges = ( [ 0..1 ], [ 1..2 ], [2..3] ); # the code inside the braces is run for every combination # of the ranges cartesian { print "indices: @_\n"; } @ranges; # here's a version using a subroutine which sums up # the indices (just to do something with them) sub compute { my $sum = 0; $sum += $_ foreach @_; print "sum of @_ = $sum\n"; } cartesian \&compute, @ranges; #### indices: 0 1 2 indices: 0 1 3 indices: 0 2 2 indices: 0 2 3 indices: 1 1 2 indices: 1 1 3 indices: 1 2 2 indices: 1 2 3 sum of 0 1 2 = 3 sum of 0 1 3 = 4 sum of 0 2 2 = 4 sum of 0 2 3 = 5 sum of 1 1 2 = 4 sum of 1 1 3 = 5 sum of 1 2 2 = 5 sum of 1 2 3 = 6