我的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");
}
}
}
答案 0 :(得分:0)
您展示的XML使用<ppi>
,而您正在搜索<ce:pii>
。
此外,您正在标记中查找文字字符串,因此您应该使用quotemeta对其进行转义,否则括号将被视为正则表达式特殊字符:
if ($line =~ m{\Q<pii>$pii</pii>}) {
更好的做法是使用实际的XML解析器,如XML::Simple或XML::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::XSH2,XML::LibXML的包装:
open file.xml ;
for //pii[.='S0002-9440(13)0072'] echo Found ;