首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl:从XML输出中填充数组(通过Eutil的PubMed UID)

Perl:从XML输出中填充数组(通过Eutil的PubMed UID)
EN

Stack Overflow用户
提问于 2013-05-20 05:58:20
回答 2查看 356关注 0票数 3

我正在尝试从PubMed的Eutils生成的XML输出构建一个ID数组。

Here is the code on GitHub。下面是具体的子例程。

做这件事最好的方法是什么?

代码语言:javascript
复制
getUID($query);

sub getUID {

  # First, build the Eutils query
  my $utils = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils'; # Base URL for searches
  my $db = 'pubmed'; # Default to PubMed database; this may be changed.
  my $retmax = 10; # Get 10 results from Eutils

  my $esearch = $utils . '/esearch.fcgi?db=' . $db . '&retmax=' . $retmax . '&term=';

  my $esearch_result = get( $esearch . $query ); # Downloads the XML

  # Second, extract the UIDs
  $esearch_result =~ m(<Id>*</Id>);      

  print $esearch_result; # This should return a list of ID's (numbers), but doesn't.

}

下面是PubMed XML结果:

代码语言:javascript
复制
<?xml version="1.0" ?>
<!DOCTYPE eSearchResult PUBLIC "-//NLM//DTD eSearchResult, 11 May 2002//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eSearch_020511.dtd">
<eSearchResult><Count>2768671</Count><RetMax>10</RetMax><RetStart>0</RetStart><IdList>
<Id>23682407</Id>
<Id>23682406</Id>
<Id>23682388</Id>
<Id>23682359</Id>
<Id>23682336</Id>
<Id>23682331</Id>
<Id>23682325</Id>
<Id>23682320</Id>
<Id>23682315</Id>
<Id>23682311</Id>
</IdList><TranslationSet><Translation>     <From>cancer</From>     <To>"neoplasms"[MeSH Terms] OR "neoplasms"[All Fields] OR "cancer"[All Fields]</To>    </Translation></TranslationSet><TranslationStack>   <TermSet>    <Term>"neoplasms"[MeSH Terms]</Term>    <Field>MeSH Terms</Field>    <Count>2430901</Count>    <Explode>Y</Explode>   </TermSet>   <TermSet>    <Term>"neoplasms"[All Fields]</Term>    <Field>All Fields</Field>    <Count>1920766</Count>    <Explode>Y</Explode>   </TermSet>   <OP>OR</OP>   <TermSet>    <Term>"cancer"[All Fields]</Term>    <Field>All Fields</Field>    <Count>1192293</Count>    <Explode>Y</Explode>   </TermSet>   <OP>OR</OP>   <OP>GROUP</OP>  </TranslationStack><QueryTranslation>"neoplasms"[MeSH Terms] OR "neoplasms"[All Fields] OR "cancer"[All Fields]</QueryTranslation></eSearchResult>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-20 06:43:14

如果您希望匹配返回一个字符串,则必须添加捕获括号。如果有多个匹配项,请使用g选项。将结果存储在数组中:

代码语言:javascript
复制
 my @matches = $esearch_result =~ m(<Id>(.*)</Id>)g;
 print "$_\n" for @matches;
票数 3
EN

Stack Overflow用户

发布于 2013-05-21 03:06:44

你可能有理由这样手动使用eutils,但我想至少让你知道还有更简单的方法。对于这些任务,我使用BioPerl中的Bio::DB::EUtilities模块,因为它使这类事情变得容易得多,并且节省了时间( EUtilities Cookbook中有一个部分显示了PubMed提供了哪些信息)。此外,还有最近更新的Bio::Biblio模块,其中包含许多用于访问PubMed记录的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16639890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档