sub break_by { my ($by, $data) = @_; my $i = 0; return sub { my $n = @$data - $i; $n = $n < 0 ? 0 : $n > $by ? $by : $n; $i += $n; return @$data[$i-$n..$i-1]; } } my @data = ( 1,2,3,4,5,6,7,8,9,10,11,12 ); my $iter = break_by(5, \@data); while (my @group = $iter->()) { print("@group\n"); }