#! perl use v5.14;; use Data::Dump qw[ pp ]; sub genNested { my $n = shift; map{ rand() < 0.5 ? [ rand(1000), genNested( $n-1 ) ] : rand( 1000 ) } 1 .. $n; } my @nested = genNested 3; pp \@nested; my @flat = 1..10; sub genIterator(+) { my $array = shift; my $index = 0; # Current index in the list my $child; # Iterator for the level below if the current element is an array return sub { my $element; if (defined $child) { $element = $child->(); } if (!defined $element) { $child = undef; $element = $index < @$array ? $array->[$index++] : undef; if (ref $element eq 'ARRAY') { $child = genIterator($element); $element = $child->(); } } return $element; } } my $next = genIterator @nested; say while $_ = $next->();