我正在继续摆脱过时的工作 生物信息学书籍 我正在尝试使用 XML::Smart 模块。

我怀疑该模块的方法在 6 年的时间里已经发生了变化,而且我对 perl 缺乏排除故障的经验 源代码. 。注释掉的代码证明了 ncbi.gov 查询功能,我在使用“新”方法时遇到了麻烦 - 它没有解析 XML。我究竟做错了什么?谢谢!

更新 具体来说,我在解析和显示 Id 数组时遇到了麻烦: my @Id = $results->{eSearchResult}{IdList}{Id}{'@'}; 我在 OSX 终端上运行此脚本,但运行此脚本时没有看到任何 ID。我看到了正确的伯爵。谢谢!

#!/usr/local/bin/perl
# use lib "/Users/fogonthedowns/myperllib";
# use LWP::Simple;
use XML::Smart;
use strict;

#Set base URL for all eutils
my $utils = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils";
my $db = "Pubmed";
my $query ="Cancer+Prostate";
my $retmax = 10;
my $esearch = "$utils/esearch.fcgi?" . 
              "db=$db&retmax=$retmax&term=";

# my $esearch_result = get($esearch.$query);
# print "ESEARCH RESULT: $esearch_result\n";
# print "Using Query: \n$esearch$query\n";
# print "hello world\n";

my $results = XML::Smart->new($esearch.$query,"XML::Parser");
my $count = $results->{eSearchResult}{Count};
my @Id = $results->{eSearchResult}{IdList}{Id}{'@'};
my $all_Id = join("\n", @Id);

print "Count = $count\n";
print "$all_Id\n";
有帮助吗?

解决方案

你做错的第一件事就是注释掉 use strict, ,第二个是使用 -w 代替 use warnings.

当严格打开时,perl 将报告:

当 tmp:test.pl 第 19 行使用“strict subs”时,不允许使用裸字“XML::Parser”。

这让我们可以追踪问题发生的位置。

文档中的示例说 第二个参数(要使用的解析器)应该被引用,但你还没有引用它。

所以我们改为:

my $results = XML::Smart->new($esearch.$query,"XML::Parser");

......然后它就运行了。

(顺便说一句,该语言称为 “Perl”,而不是“perl”或“PERL”)

其他提示

改变:

my @Id = $results->{eSearchResult}{IdList}{Id}{'@'};

到:

my @Id = $results->{eSearchResult}{IdList}{Id}('@');

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top