use strict; use warnings; use Data::Dumper; my %fields = ( f1 => [ 1, 2 ], f2 => [ 3, 4, 5 ], f3 => [ 6, 7 ], ); my @combinations = ( {} ); foreach my $field (keys %fields) { my @tmp; foreach my $value (@{$fields{$field}}) { foreach my $c (@combinations) { push(@tmp, { %$c, $field => $value } ); } } @combinations = @tmp; print "Intermediate:\n" . Dumper(\@combinations); } print "Final:\n" . Dumper(\@combinations);