Dear Monks,
I would like to count the number of occurrences of some separator(s) in a string. For example:
$string='((1,2) (b,c)' separators are '(' and ')'
The number of separators for the string is 5.
I use the tr operator to count the characters. Because the separators may vary and the transliteration table is built at compile time I use an eval. In the future more separators may be added. My code:
use strict; use warnings; sub count_separators { my $value = shift; my $delim = shift; my $set; SWITCH: { if ($delim eq '{') { $set = '{|}'; last SWITCH; } if ($delim eq '(') { $set = '(|)'; last SWITCH; } if ($delim eq '"') { $set = '"'; last SWITCH; } # Should never occur... } print 'sub { return shift =~ tr/' . $set . '//; }' . "\n"; return eval 'sub { return shift =~ tr/' . $set . '//; }'; } my $str = '((1,2)( a,b)'; my $sep = '('; my $result = count_separators ($str, $sep); $result=$result->($str); print "$result \n";
I'm not to happy about the code. I have the feeling it can be done more simple/efficient/... but I'm kinda stuck. Any ideas? Constraint: it has to run under Perl 5.8.8
Thanks upfront!
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |