$punc = "?!.";
ucfirst($string);
$string =~ s#([$punc][^a-z]*[a-z])#uc($1)#eg;
## or
$string =~ s#([$punc]\s*[a-z]#uc($1)#eg;
The first meets the strict definition of the
requirements, but also causes
"Who are you? 6 is my number"
to become
"Who are you? 6 Is my number"
which may or may not be desired. If not, the
second one only allows whitespace to be skipped between
the end of a sentence and the start of a word.
I used a-z instead of \w because otherwise
perl will try to "uppercase" an underscore, which
is not what we want. It's also safe to put the
whole thing in a single paren, and to
uppercase the whole thing, since the only part able
to be uppercased is the part we *want* uppercased.
I also removed the specification of what constitutes
the end of a sentence outside of the regular expression,
which makes it a little easier to read, and also allows
easier changes in the future without accidentally
breaking your regular expression.
The usual warning vis a vis use English;
and \w apply, of course. :)
|