my $timeout = 10; # Seconds to wait, before printing select *STDOUT; $| = 1; # Set standard output to auto flush while (1) { my $buf = my $in = ''; eval { local $SIG{ALRM} = sub { print $buf,$in; die }; while (1) { alarm $timeout; sysread *STDIN, $in, 500 or exit; alarm 0; ($buf) = ($buf.$in) =~ m/((.*?\n){0,4}.*?\n?)$/; $in = ''; } } }