http://www.perlmonks.org?node_id=468897

Count all occurrences of characters from a given set in a string.

In the code below $CharSet is the set of characters to count. $SearchStr is the string to count them in.

my $Set = qr/[^$CharSet]/; length join "", split $Set, $SearchStr;

Wrapped up in a rather more general sub:

sub CountSetChars { my $Count; my $CharSet = shift; my $Set = qr/[^$CharSet]/; my $Param; while ($Param = shift) { if (defined @$Param) {map {$Count += CountSetChars ($CharSet, $_)} @$Param;} elsif (ref $Param) {$Count += length join "", split $Set, @$Param;} else {$Count += length join "", split $Set, $Param;} } return $Count; }

Replies are listed 'Best First'.
Re: count subset of chars in a line
by Zaxo (Archbishop) on Jun 22, 2005 at 03:49 UTC

    There's a very pretty way to count them with the tr// operator, my $vowel_count = tr/AEIOUYaeiouy//; If you want the character list in a variable, you need to string-eval:  my $foo_count = eval "tr/$foo//";

    After Compline,
    Zaxo

      Argh, I knew I'd seen a tidy way to do it somewhere. Sorting out the parameter handling for the sub was good exercise though :-).

      Perl is Huffman encoded by design.