my @array1 = (1 .. 20); my @array2 = (10 .. 30); my @array3 = (19 .. 40); push @all_arrays, \@array1, \@array2, \@array3; ##This is like what will be passed in my actual code my %unique_descriptive = do { local %_; for (@{$all_arrays[0]}, @{$all_arrays[1]}, @{$all_arrays[2]}) { $_{$_}->{count}++ ; push @{$_{$_}->{values}},$_; } %_; };