my $sub = chunker(\*IN, 10); while (my @chunk = $sub->()) { # Do something amusing } sub chunker { my $fh = shift; my $count = shift; return sub { my @ret; while (@ret < $count) { my $line = <$fh>; if (defined($line)) { push @ret, $line; } else { $count = 0; } } return @ret; }; }