use List::Util qw( reduce ); my $nested_iterator = reduce { new Iterator::Product $a, $b } @sub_iterators;