my @all_nums= sort keys %all; my @clean_nums= sort keys %clean; my @fdnc_nums= sort keys %fdnc; my @dnc_nums= grep !$clean{$_} && !$fdnc{$_}, @all_nums; use List::Util 'max'; my $n= max($#all_nums, $#clean_nums, $#fdnc_nums, $#dnc_nums); for (my $i= 0; i <= $n; $i++) { $csv->print($temp_output, [ $all_nums[$i], $clean_nums[$i], $fdnc_nums[$i], $dnc_nums[$i] ]); }