in reply to communication between programs

When you've looked at all the complicated select-based work-arounds, try it the simple way :)

#! perl -sw use strict; use threads; use Thread::Queue; $|++; our $THREADS //= 4; my $Q = new Thread::Queue; async { open my $pipe, '-|', q[ perl -E"$|++; sleep(1), say $$, ':', $_ for 1 .. 3" ] or die $!; $Q->enqueue( $_ ) while defined( $_ = <$pipe> ); $Q->enqueue( undef ); }->detach for 1 .. $THREADS; for ( 1 .. $THREADS ) { print while defined( $_ = $Q->dequeue ); } __END__ c:\test>925473.pl 4648:1 4764:1 704:1 1924:1 4648:2 4764:2 704:2 1924:2 4648:3 4764:3 704:3 1924:3

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.