Я согласен со Скоттом Риппи, более или менее, написать собственный парсер.Вот простой:
my $in = 'aaa="bbb{ccc}ddd" { aa="bb,cc" { a="b", c="d" } }, ' .
'aaa="bbb{}" { aa="b}b" }, ' .
'aaa="bbb,ccc"'
;
my @out = ('');
my $nesting = 0;
while($in !~ m/\G$/cg)
{
if($nesting == 0 && $in =~ m/\G,\s*/cg)
{
push @out, '';
next;
}
if($in =~ m/\G(\{+)/cg)
{ $nesting += length $1; }
elsif($in =~ m/\G(\}+)/cg)
{
$nesting -= length $1;
die if $nesting < 0;
}
elsif($in =~ m/\G((?:[^{}"]|"[^"]*")+)/cg)
{ }
else
{ die; }
$out[-1] .= $1;
}
(протестировано в Perl 5.10; извините, у меня нет Perl 5.8 под рукой, но, насколько я знаю, нет никаких существенных различий.) Само собой разумеется,вы захотите заменить die
на что-то конкретное для приложения.И вам, вероятно, придется настроить вышеупомянутое для обработки случаев, не включенных в ваш пример.(Например, могут ли строки в кавычках содержать \"
? Может ли использоваться '
вместо "
? Этот код не обрабатывает ни одну из этих возможностей.)