Для одного вы должны использовать \b
(граница слова), чтобы соответствовать только всему слову. Например, s/hat/coat/
изменится That
на Tcoat
без начального \b
. Теперь на ваш вопрос. С флагом /e
вы можете использовать Perl-код в заменяющей части регулярного выражения. Таким образом, вы можете написать функцию Perl, которая проверяет регистр совпадений и затем правильно устанавливает регистр замены:
my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";
sub same_case {
my ($match, $replacement) = @_;
# if match starts with uppercase character, apply ucfirst to replacement
if($match =~ /^[A-Z]/) {
return ucfirst($replacement);
}
else {
return $replacement;
}
}
Печать:
That is my hat.
Hats are very expensive.