-2

我真的只需要一些基本的软件工程架构指导......当我说“架构”时,我的意思是我可以在我拥有的 Perl 书中找到的伪代码或语句,并希望有一些在线示例......

我正在使用 Perl,我正在尝试解析 Unix 系统上的 Medline/Pubmed 文件路径,以便最终将 PMID 从每个路径传递到 pmid2doi 转换网站 ( http://www.pmid2doi.org/ )。

每个链接的结构是形式的文件路径...

/xxxxx/xxxxx/xxxxx/xxxxx/xxxxx/UNC00000000000042/00223468/v45i3/S0022346809003820
                                                |<-PMID->|

00223468PMID在哪里。

$ ls
18507872 main.pdf main.raw main.xml

到目前为止,我有一些看起来像这样的东西(在 bash 中):

for doi in `find . -name "*.xml" | awk -F\/ '{print $2}' `  #this extracts the PMID
do
        echo  $doi
        wget pmid2doi website
done

现在我需要帮助将它翻译成 Perl。

pmid2doi网站需要输入 PMID 才能取回 DOI

这是我在 Perl 中运行所需要的,我需要一些帮助来设计实现它......

鉴于您的开发背景,我将不胜感激在 Perl 中生成正则表达式的任何见解或推荐网站。

非常感谢!

此外:

我看到pmid2doi网站说 REST API 需要网站加上DOI 值。
所以我需要找到一些从 URL 获取 REST 值的示例 Perl 代码。
在 REST 中,我只是按照指定的方式准备 URL,然后返回的结果应该是我想要的值。

4

2 回答 2

2

可能是这样的?

use File::Find;

my $client = REST::Client->new( $an_url );
File::Find::find( sub { 
        return unless m/\.xml$/;
        carp "Could not open $File::Find::name!" 
            unless open( my $fh, '<', $File::Find::name )
            ;
        my $doi;
        while ( <$fh> ) { 
            next unless ( $doi ) = m{[^/]*/([^/]*)};
            $client->GET( join( '/', $base, $doi ));
            do_stuff_with_content( $client->responseContent );
        }
        close $fh;
    } => '.'
);
于 2012-10-25T17:57:28.520 回答
1

我是不是误解了一些事情,或者您可以在本地 Perl 中执行此操作而不打扰网站吗?无需访问远程主机并处理延迟、使用限制等...

https://metacpan.org/module/Bio::DB::EUtilities

编辑:我是,那是 NCBI 的 CGI 客户端。来自文档:“一个单独的项目,目前存在于 BioPerl-Run 中,为 eUtils 使用基于 SOAP 的界面。”

https://bitbucket.org/reece/docdepot/src/ca32360f6fa4/archive/perl-version/bin/doi-to-pmid

#!/usr/bin/perl
# doi-to-pmid -- get the PubMed ids for a doi

use strict;
use warnings;

use Bio::DB::EUtilities;

my @pmids = doi_to_pmids( $ARGV[0] );
exit 1 unless (@pmids);
print( join("\n",@pmids), "\n" );

exit;


sub doi_to_pmids {
  my $doi = $_[0];
  my $f = Bio::DB::EUtilities->new(-eutil => 'esearch',
                                                                   -db => 'pubmed',
                                                                   -term => "$doi [doi]");
  my @ids = $f->get_ids();
  return (@ids);
}
于 2012-10-25T19:21:39.403 回答