my %terms = ( foo => 'FOO', bar => 'BAR' ); my $re = join '|', map{quotemeta} sort {length($b)<=>length($a)}keys %terms; $re = qr/($re)/i; while(){ s/$re/$terms{lc($1)}/g; print; } __DATA__ foo is a word Bar ba blacksheep