use strict; use warnings; my %input = ( r => [1..10], s => [1..10], t => [5..10], u => [11..20], ); for my $outer (sort keys %input) { next if ! $input{$outer}; my %seen = map {$_ => 1} @{$input{$outer}}; for my $inner (grep {$_ ne $outer} sort keys %input) { if (! grep {!$seen{$_}} @{$input{$inner}}) { delete $input{$inner}; } } } print "$_\n" for sort keys %input;