use IO::Select; { # Actually, I should have one buffer per filehandle, but # for simplicity, I'll assume you only ever call # this function with one filehandle. my $buffer = ""; # Note that timeout is for waiting for the \n after the # first character arrives. This function will block # forever waiting for the first character of the line sub readWithTimeout { my ($inputh, $timeout) = @_; if (length($buffer)==0) { sysread $inputh,$buffer,500; if (length($buffer)==0) {return undef;} } if ($buffer =~ s{^(.*\n)}{}) {return $1;} my $s = IO::Select->new(); $s->add($inputh); my @ready = $s->can_read($timeout); while (@ready) { last unless sysread $inputh,$buffer,500,length($buffer); if ($buffer =~ s{^(.*\n)}{}) {return $1;} @ready = $s->can_read($timeout); } $buffer =~ s/.+// or return undef; return $&; } }