Appropriating from ideas of several other postings including the OP, tybalt89's example, haukex' s use of \b, and a hopefully plausible approach to Corion's concern about case sensitivity, perhaps the following is simple but still adequate. Lower casing the "cat" may or may not be the exact right approach to being case insensitive.
use strict; use warnings; my %cats = ( blackcat=>5, whitecat=>10,orangecat=>20 ); my $texttosub = 'log10(blackcat)*whitecat*(log10(orangeCat))'; $texttosub =~ s/\b(?!log10)([a-zA-Z][A-Za-z_0-9]+)\b/$cats{lc $1}/ige; print "$texttosub\n";
Output
log10(5)*10*(log10(20))
Ron
In Section
Seekers of Perl Wisdom