use Algorithm::Loops qw( NestedLoops ); my %params = ( x_pos => [1..10], y_pos => [-5..5], z_pos => [0..15], spin => [0, 1], neato => [1..10], ); my @keys = keys %params; NestedLoops( [ @params{@keys} ], sub { function(map { $keys[$_], $_[$_] } 0..$#keys) } ); sub function { my %args = @_; print(join(', ', map { "$_ => $args{$_}" } keys %args), "\n"); } #### use Algorithm::Loops qw( NestedLoops ); my @params = ( [1..10], [-5..5], [0..15], [0, 1], [1..10], ); NestedLoops(\@params, \&function); sub function { print(join(', ', @_), "\n"); }