【发布时间】:2020-05-01 12:25:11
【问题描述】:
我想比较这两个文件,一个是用户的输入文件 txt 文件,另一个文件是 xml 文件的配置文件。如果用户的输入文件值与配置文件匹配,则显示匹配的函数。
这是用户的输入文件
L84A:FIP:70:155:15:18:
L83A:55FIP:70:155:15:
上述文件中:L84A为Design_ID,FIP为Process_ID,70到18为register_ID。
这是配置文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Sigma>
<Run>
<DESIGN_ID>L83A</DESIGN_ID>
<PROCESS_ID>55FIP</PROCESS_ID>
<RegisterList>
<Register>70</Register>
<Register>155</Register>
</RegisterList>
</Run>
<Run>
<DESIGN_ID>L83A</DESIGN_ID>
<PROCESS_ID>FRP</PROCESS_ID>
<RegisterList>
<Register>141</Register>
<Register>149</Register>
<Register>151</Register>
</RegisterList>
</Run>
<Run>
<DESIGN_ID>L84A</DESIGN_ID>
<PROCESS_ID>55FIP</PROCESS_ID>
<RegisterList>
<Register>70</Register>
<Register>155</Register>
</RegisterList>
</Run>
</Sigma>
所以在这种情况下输出应该显示:
L84A: doesn't has FIP process ID in config file.
L83A:
55FIP
70 - existing register ID
155 - existing register ID
15 - no existing register ID.
我的代码不检查各自的进程 ID 和注册 ID。它如下所示。
L84A
FIP
70 - existing register ID
155 - existing register ID
15 - existing register ID
18 - no existing register ID
L83A
55FIP
70 - existing register ID
155 - existing register ID
15 - existing register ID
下面是我的代码:
use strict;
use warnings;
use vars qw($file1 $file1cnt @output);
use XML::Simple;
use Data::Dumper;
# create object
my $xml = new XML::Simple;
# read XML file
my $data = $xml->XMLin("sigma_loader.xml");
my $file1 = "userinput.txt";
readFileinString($file1, \$file1cnt);
while($file1cnt=~m/^((\w){4})\:([^\n]+)$/mig)
{
my $DID = $1;
my $reqconfig = $3;
while($reqconfig=~m/^((\w){5})\:([^\n]+)$/mig) #Each line from user request
{
my $example1 = $1; #check for FPP/QBPP process
my $example2 = $3; #display bin full lists.
if(Dumper($data) =~ $DID)
{
print"$DID\n";
if(Dumper($data) =~ $example1)
{
print"$example1\n";
my @second_values = split /\:/, $example2;
foreach my $sngletter(@second_values)
{
if( Dumper($data) =~ $sngletter)
{
print"$sngletter - existing register ID\n";
}
else
{
print"$sngletter - no existing register ID\n";
}
}
}
else
{
print"$DID doesn't has $example1 process ID in config file\n";
}
}
else
{
print"new Design ID deteced\n";
}
}
while($reqconfig=~m/^((\w){3})\:([^\n]+)$/mig) #Each line from user request
{
my $example1 = $1; #check for FPP/QBPP process
my $example2 = $3; #display bin full lists.
if(Dumper($data) =~ $DID)
{
print"$DID\n";
if(Dumper($data) =~ $example1)
{
print"$example1\n";
my @second_values = split /\:/, $example2;
foreach my $sngletter(@second_values)
{
if( Dumper($data) =~ $sngletter)
{
print"$sngletter - existing register ID\n";
}
else
{
print"$sngletter - no existing register ID\n";
}
}
}
else
{
print"$DID doesn't has $example1 process ID in config file\n";
}
}
else
{
print"new Design ID deteced\n";
}
}
}
sub readFileinString
#------------------>
{
my $File = shift;
my $string = shift;
use File::Basename;
my $filenames = basename($File);
open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!";
read(FILE1, $$string, -s $File, 0);
close(FILE1);
}
【问题讨论】:
-
输入文件在这里如何显示
L84A:FIP:70:155:15:18: L83A:55FIP:70:155:15:这是逐行或完全合并的内容...? -
它将逐行显示
-
你为什么要一行一行地做那件事?对 XML 文件使用 XML 解析器会容易得多。 XML::Simple 并不是真正的一种。但我们可能可以使用它。 // 你的代码也有一些质量问题,其中一些是安全问题。
标签: perl