##
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;