use warnings; use strict; my %data; my %uniq; my @final; while () { $data{$_}=()=$_=~m/\s+\b/g; } OUTER: foreach my $keys (sort {$data{$b} <=> $data{$a}} keys %data) { my @list=split(/\s+/,$keys); foreach (@list) { if (exists $uniq{$_}) { next OUTER; } } $uniq{$_}++ foreach (@list); push @final, $keys; } print @final; __DATA__ mylist_12 sublist153 sublist_34 sublist_123 sublist_345 sublist_245 mylist_1 sublist_153 sublist_87 sublist_876 sublist_78 mylist_6 sublist_8 mylist_2 sublist_12 sublist_34 sublist_09 mylist_3 sublist_87 sublist_09 mylist_7 sublist_8 sublist_9 mylist_9 sublist_56