This is not very thought out or tested, probably not very efficient on large lists, but I think its interesting, and it seems to work:
#!/usr/bin/perl
use strict;
use warnings;
my @array1 = qw(dog cat rat mouse);
my @array2 = qw(dog rat mouse bird);
my @array3 = qw(cat rat fish mouse);
#my @array1= ( 1, 3, 4, 6 );
#my @array2= ( 1, 2, 4, 6 );
#my @array3= ( 1, 2, 3, 5 );
init_cmp($_) for \@array1, \@array2, \@array3;
my %animals;
undef @animals{@array1, @array2, @array3};
print join(",", keys %animals), "\n";
my @sorted = sort { my_cmp($a, $b) } keys %animals;
print join(",", @sorted), "\n";
{
my %lt;
sub init_cmp {
my ($this, @rest) = @{$_[0]};
while ( @rest ) {
$lt{$this}{$rest[0]} = 1;
$this = shift @rest;
}
}
sub is_lt {
my ($first, $next) = @_;
return unless exists $lt{$first};
return 1 if $lt{$first}{$next};
for my $mid ( keys %{$lt{$first}} ) {
return 1 if is_lt($mid, $next);
}
return;
}
sub my_cmp {
my ($first, $next) = @_;
return is_lt($first, $next) ? -1 : 1;
}
}