use strict;
use warnings;
use POSIX qw(:sys_wait_h);

my $arg = "...";
my $pid;
my $reader;
my $r_bits = '';
if ($pid = open $reader, '-|'){
	vec($r_bits, fileno($reader), 1) = 1;
	# ...
}
else {
	defined $pid or die "cannot open pipe";
	exec('perl', 'foo.pl', $arg);
	die "cannot exec command";
}

while(1) {
	my $wait_pid = waitpid $pid, WNOHANG;
	my $found = select(my $rout = $r_bits, undef, undef, 0);
	if ($found && vec($rout, fileno($reader), 1)) {
		print do{ local $/; readline($reader) };
	}
	if ($wait_pid > 0) {
		# ...
		last;
	}

	...
}