use strict; use warnings; use integer; my @data = ( ['SKU'], [1..5], [qw(T S L H)], [qw(S M L XL 2X)], [qw(BLU GRN WHT BLK)] ); my $iter = make_permutator(@data); my ($idx, @idx_link); while (my @els = $iter->() ){ print @els, "\n"; } sub make_permutator { @idx_link = (0, @_); return sub { $idx = $idx_link[0]++; my @ret; for my $i (1..$#idx_link) { push @ret, $idx_link[$i][$idx % @{$idx_link[$i]}]; $idx /= @{$idx_link[$i]}; } return $idx ? () : @ret; } } 1; __END__