I'd rather not open and close the file more than once: disk accesses take time (there's the cache, you didn't mention your file's size). Instead, I would first generate subs that count a given character and store them in a hash, referenced by that character.
Then, for each line in the file, loop over the letters and call the sub from the hash. Increment a counter which is itself stored in a hash.
#!/usr/local/bin/perl use strict; my @letter = qw/ a b c x y z /; my %subs; my %counts; foreach ( @letter ) { $subs{$_} = eval "sub { \$_[0] =~ tr/$_// }"; } while ( <DATA> ) { foreach my $letter ( @letter ) { $counts{$letter} += $subs{$letter}->($_); } } print "$_: $counts{$_}\n" foreach @letter; __DATA__ aedj dfas jijiojsdf dsfwfy jiox jiohjdfax jojojdjj, oiiia oioje asfdc +oujsdfayx soujfosdxjpoiojfdxjljojaois jojojx jopjpx jojoijx joijiodfx asdfasdf jjalsdf jlajkldf jojiojsd jiojasj ioj wwdn jojae jojocjoc joi +jss jiojwx jiojoxuiojy joiyu oiuouyy
--bwana147
In reply to Re: A another tr/// statement question..
by bwana147
in thread tr/// statement
by supernewbie
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |