#!/usr/local/bin/perl -w use strict; my @aoa = ( [('a'..'f')], [('A'..'C')], [(1..2)], ); my $iter = make_permutator(@aoa); while (my @els = $iter->() ){ print "@els\n"; } # ariels' code from here sub make_permutator { use integer; my @idx_link = (0, @_); return sub { my $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; } }