#! perl -slw use strict; use Data::Dump qw[ pp ]; my @array = (['A','B'],['C','D'],['A','C'],['E','F'],['F','G']); my %h; for( @array ) { my( $x, $y ) = @$_; $h{ $x }{ $y } = 1; $h{ $y }{ $x } = 1; } OUTER: for my $x ( reverse sort keys %h ) { for my $y ( reverse sort keys %h ) { next if $x eq $y; if( exists $h{ $y }{ $x } ) { $h{ $y }{ $_ } = 1 for keys %{ $h{ $x } }; delete $h{ $x }; next OUTER; } } } my @buckets = map[ sort keys %{ $h{ $_ } } ], keys %h; pp \@buckets; __END__ C:\test>1017261 [["A", "B", "C", "D"], ["E", "F", "G"]]