问题是当我尝试将输入与输出文件进行比较时,我无法处理括号的嵌套,并且复杂性需要非常低。这有解析模块吗?兼容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括号之外。
我试图创建哈希哈希但是失败了。有人可以建议我能做到这一点吗?
答案 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
上构建一个小解析器子类。使用后者构建一个"将字符串转换为数据结构"对于像这样的简单示例,解析器通常非常简单。