use strict; my @AoA=( ['A','B','C'], ['A','D','C'], ['A','B','C'], ); my (%join,@AoH); for (@AoA) { @join{@$_}=(); my %set; @set{@$_}=(); push @AoH,\%set; } for my $elem (sort keys %join) { for (@AoH){ print "$elem" if exists $_->{$elem}; print "\t"; } print "\n"; }