[comp.lang.perl] tr doesn't count

cluther@sonne.cnns.unt.edu (Clay Luther) (06/25/91)

Given,

$c = "3/3/3";
$c = tr/\//\//;

Why is $c set to 0 and not 2?
-- 
Clay W. Luther                  cluther@sonne.cnns.unt.edu
System Manager                  Center for Network Neuroscience
University of North Texas       PO Box 5218 Denton, Texas 76203
817/565-3896,3472               Void where prohibited by law.

Tom Christiansen <tchrist@convex.COM> (06/26/91)

From the keyboard of cluther@sonne.cnns.unt.edu (Clay Luther):
:Given,
:
:$c = "3/3/3";
:$c = tr/\//\//;
:
:Why is $c set to 0 and not 2?

Because $_ (the default operand for the tr/// operator) 
doesn't have any slashes in it.  If you had done this:

    $_ = "3/3/3";
    $c = tr/\//\//;

It would have done what you wer expecting.  Try this:


    $string = "3/3/3";

then

    $count = ( $string =~ tr#/#/#; );

which is the same as: 

    $count = $string =~ tr#/#/#;;

but since I'm never 100.000000000% sure it's not 

    ($count = $string) =~ tr#/#/#;

I use the parens anyway.

With recent patches, you could also use this:
    
    $count++ while $string =~ m#/#g;

Although the tr/// runs a good deal faster.  40% the time
for m//g in this case, even better with more things to
match.  I guess the moral is for counting single chars, use
tr///, but for counting longer patterns, you'll need m//g.


--tom
--
Tom Christiansen		tchrist@convex.com	convex!tchrist
		"So much mail, so little time."