my $newline = "\n"; #or some other unique record separator ## if we're not at eof if ($result > 0) { my $last_newline = rindex $buffer, $newline; my $remainderlen = length($buffer)-$last_newline-length($newline); if ($remainderlen <= 0) { $remainder = ''; } else { $remainder = substr($buffer, $last_newline+length($newline), $remainderlen, ''); } } ## this is important: prefix the remainder before next chunk $buffer = $remainder;