вы можете использовать регулярное выражение
попробуйте это:
my $s = "...";
$s =~ s/([\.\?!]\s*[a-z])/uc($1)/ge; # of course $1 , thanks to plusplus
g-flag ищет все совпадения, а e-flag выполняет uc для преобразования буквы в верхний регистр
Пояснение:
- с помощью [. \ ?!] вы ищете знаки препинания
- \ s * - для пробелов между знаками и первой буквой вашего следующего слова и
- [a-z] соответствует одной букве (в данном случае первое слово следующего слова
регулярное выражение, упомянутое выше, ищет с помощью этих шаблонов каждый знак препинания, за которым следуют (необязательные) пробелы и буквы, и заменяет его результатом uc (который преобразует совпадение в верхний регистр).
Например:
my $s = "this is for test. i'm new to perl! Please help. can u help? i hope so.";
$s =~ s/([\.\?!]\s*[a-z])/uc(&1)/ge;
print $s;
найдет ". I", "! P", ". C" и "? I" и заменит их, поэтому результат печати будет:
this is for test. I'm new to perl! Please help. Can u help? I hope so.