How can I replace a particular character with its upper-case counterpart?
Consider the following string
String = "this is for test. i'm new to perl! Please help. can u help? i hope so."
In the above string after .
or ?
or !
the next character should be in upper case. how can I do that?
I'm reading from text file 开发者_开发问答line by line and I need to write modified data to another file.
your help will be greatly appreciated.
you could use a regular expression try this:
my $s = "...";
$s =~ s/([\.\?!]\s*[a-z])/uc($1)/ge; # of course $1 , thanks to plusplus
the g-flag searches for all matches and the e-flag executes uc to convert the letter to uppercase
Explanation:
- with [.\?!] you search for your punctuation marks
- \s* is for whitespaces between the marks and the first letter of your next word and
- [a-z] matches on a single letter (in this case the first one of the next word
the regular expression mentioned above searches with these patterns for every appearance of a punctuation mark followed by (optional) whitespaces and a letter and replaces it with the result of uc (which converts the match to uppercase).
For example:
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;
will find ". i", "! P", ". c" and "? i" and replaces then, so the printed result is:
this is for test. I'm new to perl! Please help. Can u help? I hope so.
You can use the substitution operator s///
:
$string =~ s/([.?!]\s*\S)/ uc($1) /ge;
Here's a split
solution:
$str = "this is for test. im new to perl! Please help. can u help? i hope so.";
say join "", map ucfirst, split /([?!.]\s*)/, $str;
If all you are doing is printing to a new file, you don't need to join the string back up. E.g.
while ($line = <$input>) {
print $output map ucfirst, split /([?!.]\s*)/, $line;
}
edit - completely misread the question, thought you were just asking to uppercase the i
s for some reason, apologies for any confusion!
as the answers so far state, you could look at regular expressions, and the substitution operator (s///)
. No-one has mentioned the \b
(word boundary) character though, which may be useful to find the single i
s - otherwise you are going to have to keep adding punctuation characters that you find to the character class match (the [ ... ]
).
e.g.
my $x = "this is for test. i'm new to perl! Please help. can u help? i hope so. ".
\"i want it to work!\". Dave, Bob, Henry viii and i are friends. foo i bar.";
$x =~ s/\bi\b/I/g; # or could use the capture () and uc($1) in eugene's answer
gives:
# this is for test. I'm new to perl! Please help. can u help? I hope so.
# "I want it to work!". Dave, Bob, Henry viii and I are friends. foo I bar.
精彩评论