for (keys %matches) { my $ordered = join '', sort split //; $matches{$_} = [ grep { length($ordered) < length($_) ? 0 : do { my $re = '^(.*?)' . join('(.*)', map {quotemeta} split '') . '(.*)$'; $ordered =~ /$re/; }; } keys %words]; }