@union = sort grep { not $seen{$_}++ } (@union, @array3); #### my @array1 = ([b=>1], [d=>3], [z=>4], [e=>5]); my @array2 = ([a=>2], [b=>1], [z=>4]); my @array3 = ([d=>3], [e=>5]); #### my %seen; my @union = grep { not $seen{$_->[0]}++ } (@array1, @array2); undef %seen; @union = map { $_->[0] } sort { $a->[1] <=> $b->[1] } grep { not $seen{$_->[0]}++ } (@union, @array3); use Data::Dumper; print Dumper \@union;