use strict; my (@keywords, %keyword)=qw/foo bar 12345 abcd/; my ($string, %result) = "foobarfoo1234523423412345abcdefsadfabc"; #### @keyword{@keywords} = map {qr/\Q$_\E/} @keywords; #### $result{$_} = () = $string =~ $keyword{$_} for (keys %keyword); #### my @regexen = map { qr/(?:\Q$_\E(?{$result{$_}++}))/ } @keywords; my $re = do { local $" = '|'; qr/@regexen/; }; #### $string =~ /$re/g; print "$_: $result{$_}\n" for @keywords;