use IO::Select; $selector = IO::Select->new(); $selector->add(*CMD_ERR, *CMD_OUT); while ($selector->count()) { my ($readable, undef, $error) = IO::Select::select($selector, undef, $selector); $selector->remove($_) foreach @$error; foreach my $fh (@$readable) { ... } )