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