while (my @chunk = get_chunk(\*IN, 10)) { # etc } sub get_chunk { my $fh = shift; my $count = shift; my @result; push @result, scalar <$fh> foreach 1..$count; return @result; } #### 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; }; }