我有像这样的xml数据
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE article PUBLIC "-//ES//DTD journal article DTD version 5.2.0//EN//XML" "art520.dtd" [<!ENTITY mmc1 SYSTEM "mmc1" NDATA APPLICATION><!ENTITY mmc2 SYSTEM "mmc2" NDATA APPLICATION>]><article docsubtype="fla"> <item-info><jid>JURO</jid><aid>10407</aid><ce:pii>S0022-5347(13)04374-7</item-info><ce:inter-ref xlink:href="http://download.journals.elsevierhealth.com/mmcs/journals/0022-5347/PIIS0022534713059089.mmc2.pdf" id="intref0010"><ce:bold>Abstract</ce:bold></ce:inter-ref><ce:inter-ref xlink:href="http://download.journals.elsevierhealth.com/mmcs/journals/0022-5347/PIIS0022534713059089.mmc1.pdf" id="intref0010"> <ce:bold>Abstract</ce:bold></ce:inter-ref>
为抽象文本提供了链接,此链接由EITIY声明“MMC \ d”生成,数据在
中<pii>..</pii>
我通过从这段代码中收集两个数据来检查给定的链接是否正确,这些数据是eitiy声明“MMC1”..和
中的数据<pii></pii>
在我的代码中我收集这些数据。在此代码中,首先是mmc1和S0022-5347(13)04374-7 我在pii变量中删除' - ''('')'这个并将mmc1添加到其中。在我做这样的“PIIS0022534713059089.mmc1”并检查。
问题是
abtract文本在文件中出现两次,因此第一个摘要应包含“PIIS0022534713059089.mmc1”,第二个摘要应包含“PIIS0022534713059089.mmc2” 但如果错误地给出第一个抽象文本“PIIS0022534713059089.mmc2”和第二个抽象文本“PIIS0022534713059089.mmc1”,我们会识别并告知用户。
我的代码是
#!/usr/bin/perl
print "start..";
@files = <*.xml>;
open my $out, '>', 'output.xml' or die $!;
foreach $file (@files) {
open (FILE, "$file");
while (my $line = <FILE>) {
if ($line =~ /(<ce:pii>)(.*)(<\/ce:pii>)/) {
$pii = $2;
$pii =~ s/\-//g;
$pii =~ s/\(//;
$pii =~ s/\)//;
}
if ($line =~ /\"(mmc)([1-5]{1})\"/) {
my $count = $1 . $2;
}
if ($line =~ /$pii\.$count/) {
print ".";
}
else {
print $out("$file = wrong\n");
}
}
}
答案 0 :(得分:2)
听起来你在问如何确保每个摘要按升序显示 - 从.mmc1
开始,然后是.mmc2
,然后是.mmc3
,依此类推。我还要猜测该文件可能包含许多不同的摘要,因此ABSTRACT1.mmc3
可能后跟ABSTRACT2.mmc1
,这不应该表示错误。正确?
您可以使用哈希来跟踪特定摘要的最新mmc
个数字。然后,当您看到该摘要的新mmc
时,您可以根据之前看到的那个进行检查。像这样:
open (FILE, "$file");
my %last_mmc;
while (my $line = <FILE>) {
...
if ($line =~ /"mmc([1-5])"/) {
# Check that the mmc number is correct.
$last_mmc{$pii} ||= 0;
warn "incorrect mmc: $pii.$line" if ($2 != $last_mmc{$pii} + 1);
$last_mmc{$pii} = $2;
my $count = "mmc$2";
}
...