use strict ; use warnings ; my %h = ('this is a test' => 2, 'is a test' => 2, 'a test' => 1, 'this is' => 1, 'is a' => 1, 'unique' => 1, 'also Unique' => 3, ) ; my @k = sort { length($b) <=> length($a) } keys(%h) ; my $s = "\0". join("\0", @k)."\0" ; # Assumption: "\0" doesn't appear in any key study $s ; foreach my $k (@k) { $s =~ m/(.)$k(.)/ ; if (($1 ne "\0") || ($2 ne "\0")) { delete $h{$k} ; } ; } ; print join(', ', map "'$_'", sort keys %h), "\n" ;