$string='((1,2) (b,c)' separators are '(' and ')' #### 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";