Один не разветвляет несколько потоков, один разветвляет процессы. Каждый новый процесс выполняется в своем собственном пространстве памяти, и изменение любых значений переменных в одном процессе не влияет на эти значения в любом другом процессе. Чтобы делать то, что вы хотите, вам понадобится какое-то межпроцессное взаимодействие.
Один простой способ реализовать это состоит в том, чтобы каждый дочерний процесс записывал свои выходные данные в файл и чтобы родительский процесс читал этот файл, когда дочерние процессы сделаны. Вы могли бы даже сделать так, чтобы все дети записали в один файл, если вы помните о проблемах параллелизма:
sub write_child_output_to_file {
my ($msg, $file) = @_;
open my $fh, '>>', $file;
flock $fh, 2;
seek $fh, 0, 2;
print $fh $msg;
close $fh;
}
Модуль Forks::Super
имеет функции, которые могут обрабатывать эти детали для вас:
use Forks::Super;
use Data::Dumper;
my %foo;
for my $i (1 .. 5) {
fork {
share => [ \%foo ],
sub => {
# the code that will run in each child process.
# Updates to the variable %foo in the child will be
# available to the parent when the child finishes
...
}
};
}
waitall;
print "Data produced in all the children: ",
Data::Dumper::Dumper(\%foo);