# Open connections for my $server (@targets) { $ssh{$server} = new Net::OpenSSH($server, ...); } # Do stuff in parallel for my $server (@targets) { my $pid = fork(); if ($pid) { $pid{$server} = $pid; } else { # In child process. Do stuff $ssh{$server}->system( stuff ); ... exit 0; } } waitpid($pid{$_}) for @targets; # Do more stuff ... for my $server (@targets) { $ssh->system (more stuff); }