my $str = do {my $i; join "", map {$_ eq '(' ? $i++ : $_ eq ')' && $i ? $i-- : $_ eq ',' && $i ? ($_ = ';') : 0; $_} split '[(,)]', $str}; #### "(foo),(bar)" #### substr($str, index($str, "("), rindex($str, ")") - length($str)) =~ s/,/;/g;