我有一个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文件中的规则匹配输入。
我如何比较这两种模式?
答案 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";
}
}