开发者

How can I replace a particular character with its upper-case counterpart?

开发者 https://www.devze.com 2023-04-12 23:05 出处:网络
Consider the following string String = \"this is for test. i\'m new to perl! Please help. can u help? i hope so.\"

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 is 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 is - 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.
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号