sub iterstart { my @a = @_; return sub { my $n = shift; $n = 1 unless defined $n; return splice @a, 0, $n; }; } @data = qw(1 fee 2 fee fi 3 fee fi fo 4 fee fi fo fum 1 fin); my $iter = iterstart @data; while (my ($len) = $iter->()) { push @lol, [$iter->($len)]; } use Data::Dumper; print Dumper \@lol;