in reply to This should be easy: counting letters in a string

The transliteration does not interpolate the variable as you expect in your sample. The following illustrates the use of eval.
use strict; use warnings; my @letters = qw (A B C D E F); my $string = "AFTYUBEWTWECRTUTYIYTDDDDRYJURTHJTREEEEEFGSDFF"; my $count; foreach my $a(@letters) { eval "\$count = \$string =~ tr/$a//"; print "$count\n"; }
You can also use a substitution in order to interpolate but avoid the eval.
$count = $string =~ s/$a//g;
Both methods change the string. A more flexible way to count the values would be to split the string and use a hash to store the values.
my %count; $count{$_}++ foreach split //, $string; print "$count{$_}\n" foreach (@letters);

Replies are listed 'Best First'.
Re^2: This should be easy: counting letters in a string
by Roy Johnson (Monsignor) on Jan 31, 2006 at 14:46 UTC
    Both methods change the string.
    No, tr/a// will not delete characters unless you specify the d modifier. Characters that are not replaced are left alone.

    And using a little trick to induce list context, you can use pattern matching to count the occurrences:

    my @letters = qw(A B C D E F); my $string = 'AFTYUBEWTWECRTUTYIYTDDDDRYJURTHJTREEEEEFGSDFF'; my @counts; for (0..$#letters) { $counts[$_] = () = $string =~ /$letters[$_]/g; } print "@counts\n";

    Caution: Contents may have been coded under pressure.