如何用perl中的文本搜索数字?

时间:2014-03-09 07:13:20

标签: xml regex perl

我的XML数据包含

<pii>S0002-9440(13)0072</pii><doi>10.1016/j.ajpath.2013.10.014</doi>

本文。我写了perl脚本找到这个内容,但我的脚本找不到这个S0002-9440(13)0072 ..

我的脚本是

#!/usr/bin/perl  
print "start..";
@files = <*.xml>;
open my $out, '>', 'output.txt' or die $!;
my $pii='S0002-9440(13)0072';
foreach $file (@files) {
    open(FILE, "$file");
    while(my $line= <FILE> ){
        if($line =~ /<ce:pii>$pii<\/ce:pii>/) {
            print $out("found");
        }
        else {
            print $out("not fond\n");
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您展示的XML使用<ppi>,而您正在搜索<ce:pii>

此外,您正在标记中查找文字字符串,因此您应该使用quotemeta对其进行转义,否则括号将被视为正则表达式特殊字符:

if ($line =~ m{\Q<pii>$pii</pii>}) {

更好的做法是使用实​​际的XML解析器,如XML::SimpleXML::Twig。下面是使用这些模块和一些假xml数据的演示:

#!/usr/bin/perl  

use XML::Simple;
use XML::Twig;

use strict;
use warnings;
use autodie;

my $file = 'test.xml';
my $pii = 'S0002-9440(13)0072';

# Fake Data
my $data = do { local $/; <DATA> };

# Setup Fake Data in a file
open my $outfh, '>', $file;
$outfh->print($data);
close $outfh;

# Regex
{
    if ($data =~ m{\Q<pii>$pii</pii>}) {
        print "regex - found\n";
    } else {
        print "regex - not found\n";
    }
}

# XML::Simple
{
    my $xml = XMLin($file);

    if ($xml->{pii} eq $pii) {
        print "XML::Simple - found\n";
    } else {
        print "XML::Simple - not found\n";
    }
}

# XML::Twig
{
    my $ppival = '';
    my $t = XML::Twig->new( twig_handlers => {
        'pii' => sub { $ppival = $_->text },
    })->parsefile( $file );

    if ($ppival eq $pii) {
        print "XML::Twig - found\n";
    } else {
        print "XML::Twig - not found\n";
    }

}

1;

__DATA__
<root>
<pii>S0002-9440(13)0072</pii><doi>10.1016/j.ajpath.2013.10.014</doi>
</root>

答案 1 :(得分:0)

是的,我同意米勒。

我们也可以这样做。

#!/usr/bin/perl

use strict;

open(FILE,"<xml_file_path>") || warn "cant open the file file.xml";

my @array = <FILE>;

foreach my $arr (@array)
{

 if ($arr=~m/\<pii\>S0002\-9440\(13\)0072\<\/pii\>/g) # or if ($arr=~m/\<pii\>\w(.*)\<\/pii\>/g)     

        {
         print "pattern found\n";
        }

else    {

       print "pattern not found\n";
        }
}

exit 0;

答案 2 :(得分:0)

如果您的输入是XML文件,请使用正确的XML解析器。例如,XML::XSH2XML::LibXML的包装:

open file.xml ;
for //pii[.='S0002-9440(13)0072'] echo Found ;