如何使用perl识别和检查文本?

时间:2013-12-17 01:22:19

标签: perl

我有像这样的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");
        }
    }
}

1 个答案:

答案 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";
    }
    ...