To count the number of occurences of a rgex match in a string, I got the
following suggestions:
$count = $string =~ tr/a//; # From several of you...
This works only if you are looking for individual characters. That isn't
what I intended, but it was a very good solution to the example I posed. It
is very fast, too. Trouble is that I never even think of using tr even when
I should. It sits in the corner of my mind called "Perl Trivia" along with
all the other stuff you can do but won't remember until someone else points
out you should've.
$count =0;
$string =~ s/a/ ++$count , 'a' /eg; # Thanks to Jason Lampert
This one is a little less obvious, but if you are familiar with the ","
operator, it makes perfect sense. Each time the search comes up with a
match, it executes the second half, which increments the count and returns
the sub. The problem is you have to replace it if you want the string intact
afterwards. I don't know what the overhead for this one is time wise
compared to the following.
There is another version using the matching operator:
$count = () = $string =~ /a/g; # Thanks to Daniel Chetlin
This one is a bit cryptic, but it gets the point across. How in the WORLD
did you know about doing
$SizeOfTheArrayReturnedByTheFunction = () =
SomeFunctionWeWantAnArrayFromNotAScalar();
is a mystery to me... but now I know. The main point from this is that in
array context, m//g returns an array of all the matches.
There is a similar one:
$count = 0;
$count ++ while ($string =~ /a/g); # Thanks to Joel Grow
That matches em all, puts it in an array and iterates over the array
incrementing count each time. I learn more about "while" and "for/foreach"
every day in perl. Those two functions have endless possibilities...
The next one comes from Jason Lamport as well, it having to use the variable
$/:
$/ = 'a';
$count = -1;
while (<>) { ++$count; }
This is pretty cool, but you can't use regexes. $/ is one of those variables
that I read about, forgot, seen it used, forgot, and seen it used again, but
keep forgetting about. I suspect that if you have large files you want to
count, this is the way to go.
There's more than one way to do it, as the saying goes... Thanks for all the
input!
Jonathan M. Gardner
CarDomain Networks
(425)820-2244 x23
gardner at sounddomain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
POST TO: spug-list at pm.org PROBLEMS: owner-spug-list at pm.org
Subscriptions; Email to majordomo at pm.org: ACTION LIST EMAIL
Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
For daily traffic, use spug-list for LIST ; for weekly, spug-list-digest
Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/