Я пытаюсь создать массив идентификаторов из XML-результата, созданного Eutils PubMed.Perl: заполнить массив из XML-вывода (UID-файлы PubMed через Eutils)
Here is the code on GitHub. А ниже - специальная подпрограмма.
Каков наилучший способ сделать это?
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 выглядит следующим образом:
<?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>
Не могли бы вы объяснить, как работает эта линия: 'my @matches = $ esearch_result = ~ m ( (. *) ) g;'? Я видел, что m, g используется в регулярных выражениях, но не совсем так. Я также всегда был смущен тем, что именно происходит с x = ... = ~ ... –
@SteveP .: '$ esearch_result' сопоставляется (используя оператор привязки' = ~ ') против регулярного выражения, которое захватывает идентификаторы. Результат, т. Е. Список идентификаторов, присваивается (используя оператор присваивания '=') массиву. – choroba
Я понимаю, что '/ g' позволяет пройти через все совпадения, но что заставляет его перебирать все? Это факт, что '$ esearch_results' присваивается' @ matches'? Я все еще немного смущен, потому что всякий раз, когда я использовал '/ g', мне приходилось использовать его в цикле, чтобы на самом деле пройти и получить все совпадения во всей строке (не уверен, что это важно, но я никогда не использовал 'm /'). –