sub get_nice_chunk { my($fh, $size) = @_; local $/ = ''; local $_; my $chunk; $chunk .= $_ while $_ = <$fh> and length($_) + length($chunk) < $size; seek $fh, tell($fh) - length($_), 0 if length($_) + length($chunk) < $size; return $chunk; } print "got chunk: $_" while $_ = get_nice_chunk(\*DATA, 19); __DATA__ foo bar baz quux ichi ni san shi the last bit