victor@arnor.UUCP (Victor Miller) (03/16/91)
I wrote the function given below to transform a string with -'s in it
so that all alphabetics were lower case, except at the beginning of
the string or immediately after a dash, in which case it would be
upper case. The follow works correctly, but I was wondering (in the
JAPH spirit), if there is a more clever (or concise) way of doing it.
sub normalize {
local(@pieces) = split(/-/,$_[0]);
local($i);
foreach $i (0..$#pieces) {
$pieces[$i] =~ tr/A-Z/a-z/;
substr($pieces[$i],0,1) =~ tr/a-z/A-Z/;
}
join('-',@pieces);
}
--
Victor S. Miller
Vnet and Bitnet: VICTOR at WATSON
Internet: victor@ibm.com
IBM, TJ Watson Research Centerlwall@jpl-devvax.jpl.nasa.gov (Larry Wall) (03/16/91)
In article <VICTOR.91Mar15171726@irt.watson.ibm.com> victor@ibm.com writes: : I wrote the function given below to transform a string with -'s in it : so that all alphabetics were lower case, except at the beginning of : the string or immediately after a dash, in which case it would be : upper case. The follow works correctly, but I was wondering (in the : JAPH spirit), if there is a more clever (or concise) way of doing it. : : sub normalize { : local(@pieces) = split(/-/,$_[0]); : local($i); : foreach $i (0..$#pieces) { : $pieces[$i] =~ tr/A-Z/a-z/; : substr($pieces[$i],0,1) =~ tr/a-z/A-Z/; : } : join('-',@pieces); : } Oh, there's probably several things we can do to improve it. First, you don't need to use an index: sub normalize { local(@pieces) = split(/-/,$_[0]); foreach $piece (@pieces) { $piece =~ tr/A-Z/a-z/; substr($piece,0,1) =~ tr/a-z/A-Z/; } join('-',@pieces); } You could get a little more concise with a substitute instead of a split: sub normalize { local($_) = @_; local($tmp); tr/A-Z/a-z/; s#((^|-)[a-z])#($tmp = $2) =~ tr/A-Z/a-z/,$tmp#eg; $_; } That's still a bit gross. With 4.0, you'll be able to do it like this: sub normalize { local(@pieces) = split(/-/,$_[0]); foreach $piece (@pieces) { $piece = "\u\L$piece"; } join('-',@pieces); } or sub normalize { local($_) = "\u\L$_[0]"; s/-([a-z])/-\u$1/g; $_; } or, for those who prefer one-liners, sub normalize { join('-', grep(s/(.*)/\u\L$1/, split(/-/, $_[0]))); } Larry
tchrist@convex.COM (Tom Christiansen) (03/16/91)
From the keyboard of victor@ibm.com:
:I wrote the function given below to transform a string with -'s in it
:so that all alphabetics were lower case, except at the beginning of
:the string or immediately after a dash, in which case it would be
:upper case. The follow works correctly, but I was wondering (in the
:JAPH spirit), if there is a more clever (or concise) way of doing it.
:sub normalize {
: local(@pieces) = split(/-/,$_[0]);
: local($i);
: foreach $i (0..$#pieces) {
: $pieces[$i] =~ tr/A-Z/a-z/;
: substr($pieces[$i],0,1) =~ tr/a-z/A-Z/;
: }
: join('-',@pieces);
: }
Before 4.0, you have to use this:
sub normalize {
local($_) = @_;
tr/A-Z/a-z/;
substr($_,$[,1) =~ tr/a-z/A-Z/;
s/(-[a-z])/$x = tr#a-z#A-Z#, $x/ge;
$_;
}
But at 4.0beta or above, this works, and runs in just 40% the time of
my previous example:
sub normalize {
local($_) = @_;
tr/A-Z/a-z/;
substr($_,$[,1) =~ tr/a-z/A-Z/;
s/-([a-z])/-\u$1/g;
$_;
}
The first two tr's could have been done with \L and \u escapes, but
the tr's run a good faster that they do in those cases.
--tom