my @key_array = 'a' .. 'z'; my @set_array = ( ['a', 'b'], ['e','f'], ['f','g'] ); my %set = map {$_ => {$_ => 1}} @key_array; for my $s (@set_array) { @{$set{$_}}{@$s} = (1) x @$s for @$s; } my $saw = ''; print map "$_\n", grep $saw =~ s/^(?!.*$_)/$_ /, sort {length $b <=> length $a || $a cmp $b} map join(',', sort keys %$_), values %set;