use IO::Select; my $s = new IO::Select; $s->add($h1); $s->add($h2); my (%handler, %buf); $handler{$h1} = sub { ...handle a line from $h1... }; $handler{$h2} = sub { ...handle a line from $h2... }; while ($s->count) { my @ready = $s->can_read(); for my $h (@ready) { my $nr = sysread($h, $buf{$h}, 1024, length($buf{$h})); if ($nr == 0) { # eof detected $s->remove($h); } else { if ($buf{$h} =~ s/\A(.*?)\n//) { $handler{$h}->($1); } } } } #### open(my $h1, "nc server.com 12345|"); open(my $h2, "nc server.com 6789|"); # now call the above I/O handler loop #### open(my $h1, "while true; do nc server.com 12345; sleep 10; done|"); # ditto for $h2