use JSON::XS 'encode_json', 'decode_json'; $pm->run_on_finish(sub { my ($pid, $exit_code, $filename) = @_; print "** $ident was just written"; open my $fh, '<', $filename or die "Couldn't read child results from '$filename': $!"; binmode $fh; local $/; my $results = <$fh>; # Convert results back to the data structure: $results = json_decode( $results ); # now, merge those results with the other results you already have }); ... for my $task (@tasks) { my $filename = "some filename based on $task"; $pm->start( $filename ) and next; ... do the work open my $fh, '>', $filename or die "Couldn't write output file '$filename': $!"; binmode $fh; print $fh json_encode(\%results); };