I'm not sure about the application, but it might be advisable
to at least put in some '\b's to prevent unfortunate
collisions that would render some names as "Mikestone",
or "Moeseph".
Here is a slight modification of
japhy's (or
merlyn's, you decide) code:
$keys = join '|', map "\\b\Q$_\E\\b", keys %sub_hash;
$keys_REx = qr/$keys/;
$string =~ s/($keys_REx)/$sub_hash{$1}/g;