perl:是否有寻找不匹配的括号/括号/ parens等的启发式方法

时间:2016-11-11 02:11:37

标签: perl heuristics

我正在使用perl来解析json文件。当一切正常时,我发现匹配的牙套很好。但是如果存在不匹配,我就无法想出找到它的好方法。

此时我的数据是一个排序数组(@merged)  文件中大括号的偏移,关闭大括号的偏移设置为负。

以下是进行匹配的部分:

    @stack=();
    foreach $val (@merged) # go through merged array
    {   if ($val>0) { push @stack, $val;} # push every opener onto a stack
        else {  $opn = pop @stack; # when a closer comes up, pop previous opener
                @tmp = ($opn, abs $val); # array of one match
                push @matches, [@tmp];  # the array of all matches
            }
    }

我也有关于该列的信息,但我不希望算法依赖于强制格式化。

我也想把它改编成perl文本,因为翻译者说最后有一个无与伦比的支撑。

是否有任何良好的启发式方法可以找到不匹配的位置?

2 个答案:

答案 0 :(得分:2)

使用解析器,不要尝试重新发明轮子。这是一个例子:

#!/usr/bin/env perl

use strict;
use warnings;

use JSON qw( decode_json encode_json );

my $data = { foo => 'bar', baz => [1,2,3], qux => { abc => 1, def => 2, ghi => 3} };
my $json = encode_json($data);

my $error_json = $json;
$error_json =~ s|\]||; # Remove a closing square bracket

eval {
    my $error_data = decode_json($error_json); # Will throw an error
};
my $error = $@;
if ($error) {
    print "JSON Error : $error";
    my ($char_pos) = $error =~ m|at character offset (\d+)|;
    print "Original   : '$json'\n";
    print "Error      : '$error_json'\n";
    print "..............";
    print "."x($char_pos) . "^\n";

} else {
    die "should not get here...something went wrong";
}

<强>输出

JSON Error : , or ] expected while parsing array, at character offset 31 (before ":{"abc":1,"ghi":3,"d...") at foo.pl line 15.
Original   : '{"foo":"bar","baz":[1,2,3],"qux":{"abc":1,"ghi":3,"def":2}}'
Error      : '{"foo":"bar","baz":[1,2,3,"qux":{"abc":1,"ghi":3,"def":2}}'
.............................................^

答案 1 :(得分:0)

我发现了一种大多数时候都会起作用的启发式方法,特别是如果你强迫要打开和关闭括号。

我扫描文件,找到匹配的括号,找到列之间的差异。该错误通常比大多数匹配更大的差异。

当然,我必须忽略评论或引号中的括号。

我已将它与.pl和.js文件一起使用,效果很好。