我或多或少同意 Scott Rippey 关于编写自己的解析器的观点。这是一个简单的:
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
用特定于应用程序的东西替换 s。而且您可能必须调整上述内容以处理示例中未包含的情况。(例如,引用的字符串是否可以包含\"
? 可以'
用来代替"
? 此代码不处理任何一种可能性。)