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;