1.9. Controlling CaseProblemA string in uppercase needs converting to lowercase, or vice versa. Solution
Use the use locale; # needed in 5.004 or above $big = uc($little); # "bo peep" -> "BO PEEP" $little = lc($big); # "JOHN" -> "john" $big = "\U$little"; # "bo peep" -> "BO PEEP" $little = "\L$big"; # "JOHN" -> "john"
To alter just one character, use the $big = "\u$little"; # "bo" -> "Bo" $little = "\l$big"; # "BoPeep" -> "boPeep" DiscussionThe functions and string escapes look different, but both do the same thing. You can set the case of either the first character or the whole string. You can even do both at once to force uppercase on initial characters and lowercase on the rest.
The use locale; # needed in 5.004 or above $beast = "dromedary"; # capitalize various parts of $beast $capit = ucfirst($beast); # Dromedary $capit = "\u\L$beast"; # (same) $capall = uc($beast); # DROMEDARY $capall = "\U$beast"; # (same) $caprest = lcfirst(uc($beast)); # dROMEDARY $caprest = "\l\U$beast"; # (same) These capitalization changing escapes are commonly used to make the case in a string consistent:
# capitalize each word's first character, downcase the rest
$text = "thIS is a loNG liNE";
$text =~ s/(\w+)/\u\L$1/g;
print $text;
You can also use their functional forms to do case-insensitive comparison: if (uc($a) eq uc($b)) { print "a and b are the same\n"; } The randcap program, shown in Example 1.2 , randomly capitalizes 20 percent of the letters of its input. This lets you converse with 14-year-old WaREz d00Dz. Example 1.2: randcap#!/usr/bin/perl -p # randcap: filter to randomly capitalize 20% of the letters # call to srand() is unnecessary in 5.004 BEGIN { srand(time() ^ ($$ + ($$ << 15))) } sub randcase { rand(100) < 20 ? "\u$_[0]" : "\l$_[0]" } s/(\w)/randcase($1)/ge; % randcap < genesis | head -9 A more interesting approach would have been to take advantage of Perl's ability to use bitwise operators on strings: sub randcase { rand(100) < 20 ? ("\040" ^ $1) : $1 }
That would, in 20 percent of the cases, switch the case of the letter. However, this misbehaves on 8-bit characters. The original
randcase
program had the same problem, but appying This example of bitwise string operations quickly strips off all the high bits on a string: $string &= "\177" x length($string); Again, they'll be talking about you all over Europe, and not in the most glowing of terms, if you force all strings to seven bits. See Also
The Copyright © 2001 O'Reilly & Associates. All rights reserved. |
|