#!/usr/bin/perl use warnings; use strict; my %pids; my @to_be_processed = (1..20); my $cmd = 'echo'; foreach my $p (@to_be_processed){ $pids{$p}{'pid'} = open($pids{$p}{'fh'}, "$cmd $p 2>&1 |"); } foreach my $key(keys %pids){ my $fh = $pids{$key}{'fh'}; while (<$fh>){ print $_; #stuff data here into a return hash } } foreach my $key(keys %pids){ waitpid($pids{$key}, 1); } print "done\n";