my @all; my @group1_s = sort compare_func @group1; my @group2_s = sort compare_func @group2; while (@group1_s && @group2_s) { my $cmp = compare_func($group1_s[0], $group2_s[0]); if ($cmp < 0) { push(@all, shift(@group1_s)); } elsif ($cmp > 0) { push(@all, shift(@group2_s)); } else { push(@all, scalar(shift(@group1_s), shift(@group2_s))); } } push(@all, @group1_s, @group2_s);