my $buf = ''; my $offset = 0; DATA: for (;;) { # For each record my $buf = ''; my $offset = 0; my $rec; do { # Until we have a record. my $len = sysread(STDIN, $buf, 1024, $offset); die("Unable to read from XXX: $!\n") if not defined $len; die("Unable to read from XXX: Premature end of file\n") if not $len and $offset; last DATA if not $len; my $pos = index($buf, "\x0D\x0A", $offset); $offset += $len; } while $pos < 0; $rec = substr($buf, 0, $pos+2); $buf = substr($buf, $pos+2); ... process $rec ... }