将XML中的规则映射到perl中的输入

时间:2014-08-12 04:49:10

标签: xml regex string perl

我有一个XML文件,其中定义的规则很少,如下所示:

<Rule id="1" author="xyz">
   <in>SN=${ID}</in>
   <out>SUN-${ID}</out>
</Rule>
<Rule id="2" author="xyz">
   <in>SN=${ID},MN=${mID}</in>
   <out>SUN-${ID}/MUN-${mID}</out>
</Rule>

我有一个输入文件,我将输入

SN=1,MN=RMMS2

我需要根据xml文件中的规则检查此输入,并通过perl脚本获取匹配的输出。

在这种情况下,我需要输出为

SUN-1/MUN-RMMS2

我无法根据XML文件中的规则匹配输入。

我如何比较这两种模式?

1 个答案:

答案 0 :(得分:2)

您可以从尝试匹配输入的每个<in>构建正则表达式。如果匹配成功,您可以使用匹配结果将<out>转换为预期输出。

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

use XML::LibXML;

my $xml = 'XML::LibXML'->load_xml( location => 'rules.xml' );

my $input = 'SN=1,MN=RMMS2';

for my $rule ($xml->findnodes('//Rule')) {
    my ($pattern) = $rule->findvalue('in');
    $pattern =~ s/\${([^}]+)}/(?<$1>[^,]+)/g;
    if ($input =~ /^$pattern$/) {
        my %replace = %-;
        my $output = $rule->findvalue('out');
        $output =~ s/\${([^}]+)}/$replace{$1}[0]/g;
        print "$output\n";
    }
}