use Algorithm::Loops qw( NestedLoops ); my @inputs = ( [qw( 1 2 )], [qw( a b )], [qw( $ * & )], ); my $iter = NestedLoops(\@inputs); while ( my @list = $iter->() ) { print(join(',', @list), "\n"); }