Ну, старый вопрос, но я просто столкнулся с этим всю ночь, и вопрос так и не был отмечен как отвеченный, так что если кто-то приедет сюда от Google, как я, то вот что я наконец-то получил.Это очень короткий ответ, использующий только встроенные функции регулярного выражения PERL:
my $string='ab,12,20100401,xyz(A,B)';
string =~ 's/((\((?>[^)(]*(?2)?)*\))|[^,()]*)(*SKIP)([,])/$1\n/g';
my @array=split('\n',$string);
Запятые, которые не заключены в скобки, заменяются на новые строки, а затем массив разделяется на них.Это будет игнорировать запятые внутри любого уровня вложенных скобок, если они правильно сбалансированы с соответствующим количеством открытых и закрытых скобок.
Предполагается, что у вас не будет символов новой строки \n
в начальном значении $ string.Если вам нужно, либо временно замените их чем-то еще до строки подстановки, а затем используйте цикл, чтобы заменить обратно после split
, или просто выберите другой разделитель для разделения массива.