Вы могли бы использовать открытое по трубопроводу для процесса, ala
use 5.013;
use warnings;
use autodie;
open my $cmd1_fh, '-|', 'dir';
open my $cmd2_fh, '-|', 'cls';
Или, если вас не волнует вывод, fork , а затем exec :
my @child_pids;
for my $cmd ('dir', 'cls') {
defined(my $child_pid = fork()) or die "Couldn't fork: $!";
if ($child_pid == 0) {
exec $cmd;
} else {
push @child_pids, $child_pid;
}
}
for my $pid (@child_pids) {
waitpid($pid, 0);
}
(Если вам небезразличен вывод, ответвление, а затем обратная связь?)
Или использовать потоки (я не горжусь этим примероми я еще даже не написал. Посмотрите пример, использующий Thread :: Queue для чего-то гораздо менее ужасного)
use threads;
my @threads;
for my $cmd ('dir', 'cls') {
push @threads, threads->create(sub { system @_ }, $cmd);
}
$_->join for @threads;
Есть также несколько модулей, которые помогут вам с этим, например Parallel :: ForkManager и Win32 :: Job .