как искать номер с текстом в perl?

81
6

Мои данные 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");
}
}
}

спросил(а) 2014-03-09T10:13:00+04:00 6 лет, 7 месяцев назад
1
Решение
58

Да, я согласен с мельником.

можем ли мы так сделать.

#!/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;

ответил(а) 2014-03-09T11:19:00+04:00 6 лет, 7 месяцев назад
42

Если ваш вход является XML файлом, используйте правильный синтаксический анализатор XML. Например, XML :: XSH2, оболочка вокруг XML :: LibXML:


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

ответил(а) 2014-03-09T13:17:00+04:00 6 лет, 7 месяцев назад
41

Представленный 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>

ответил(а) 2014-03-09T11:03:00+04:00 6 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема