sub search { my ($target, $partsLu, $used) = @_; unless (length $target) { $v = join (",", @$used); if (substr($v, 0, 1) eq "," or $v =~ /,,/) {} else { push(@input, join (",", @$used))}; return; } for my $part (keys %$partsLu) { next unless 0 == index $target, $part; my $remainder = substr $target, length $part; delete $partsLu->{$part} unless --$partsLu->{$part}; search ($remainder, {%$partsLu}, [@$used, $part]); } }