字符串解析perl中的嵌套括号

时间:2014-11-25 08:40:38

标签: perl parsing

问题是当我尝试将输入与输出文件进行比较时,我无法处理括号的嵌套,并且复杂性需要非常低。这有解析模块吗?兼容5.8.4。我找到了模块,但它们至少需要5.10。:(

输入

(K1=V1,K2=V2,K3=V3(K2=V2.K5=V5)K6=V6(K7=V7,K8=V8(K9=V9,K10=V10)K11=V11)K12=V12,K13=V13)

输出文件

(K0=V0,K1=V1,K2=V2,K3=V3(K1=V1,K2=V2,K4=V4,K5=V5,K14=V14),K15=V15,K6=V6(K18=V18,K7=V7,K19=V19,K8=V8(K20=V20,K9=V9,K16=V16,K10=V10,K21=V21)K11=V11)K12=V12,K13=V13,K22=V22)

我需要从输入中拾取每个键值对,并从输出文件中逐个验证值是否相同。如果不是

我需要使用现有值存储密钥。(问题在于嵌套)

INPUT

K3=V3(K2=V2,K5=V5)

输出

K3=V3(K1=V1,K2=V2,K4=V4,K5=V5,K14=V14)

问题是" K2 = V2"在V3值内部检查输出文件中的V3值。所以我不能只使用正则表达式,因为K2 = V2也可能出现在V3括号之外。

我试图创建哈希哈希但是失败了。有人可以建议我能做到这一点吗?

2 个答案:

答案 0 :(得分:0)

以下代码构建哈希的哈希值。请注意,如果值(V3)包含内部哈希值,则会丢失。

#!/usr/bin/perl
use warnings;
use strict;

use Data::Dumper;

sub to_hash {
    my $string = shift;
    $string =~ s/^\( | \)$//gx; # Remove the outer parentheses.

    my @stack = {};
    my @keys;

    while (length $string) {
        $string =~ s/^([^,=()]+) = ([^(),]*)//x or die $string;
        my ($key, $value) = ($1, $2);
        $stack[-1]{$key} = $value;
        next if $string =~ s/^,//;

        if ($string =~ s/^\(//) {
            push @stack, {};
            push @keys, $key;

        } elsif ($string =~ s/^\),?//) {
            my $last = pop @stack;
            $stack[-1]{ pop @keys } = $last;
        }
    }

    return $stack[0]
}

my $input = '(K1=V1,K2=V2,K3=V3(K2=V2,K5=V5)K6=V6(K7=V7,K8=V8(K9=V9,K10=V10)K11=V11)K12=V12,K13=V13)';

print Dumper to_hash($input);

输出

$VAR1 = {
          'K2' => 'V2',
          'K13' => 'V13',
          'K6' => {
                    'K7' => 'V7',
                    'K8' => {
                              'K9' => 'V9',
                              'K10' => 'V10'
                            },
                    'K11' => 'V11'
                  },
          'K3' => {
                    'K2' => 'V2',
                    'K5' => 'V5'
                  },
          'K12' => 'V12',
          'K1' => 'V1'
        };

答案 1 :(得分:0)

嵌套的parens建议应用Text::Balanced及其extract_bracketed函数,或者在Parser::MGC上构建一个小解析器子类。使用后者构建一个"将字符串转换为数据结构"对于像这样的简单示例,解析器通常非常简单。