use strict; use warnings; use Data::Dump qw/pp dd/; use feature 'say'; my %hash = ( 'rendition' => '3', 'automation' => '2', 'saturation' => '3', 'mass creation' => 2, 'automation technology' => 2, 'automation technology process' => 3 ); # prepare sub-slices my @slices; my $max_del = 3; for my $del ( 0 .. $max_del ) { for my $i (0 .. $del) { for my $l ( $i .. $del) { push @{ $slices[$del] }, [$i .. $l] unless $i==0 and $l == $del; # exclude identity } } } sub partitions { my $group =shift; my @words = split / /,$group; return map { join " ", @words[@$_] } @{$slices[$#words]} } delete @hash{ partitions($_) } for keys %hash ; say "Result: ", pp \%hash; say "# --- tests"; say '@slices = ', pp \@slices; say "partitions('automation technology process limit') = " , pp partitions('automation technology process limit');