MetaCPAN API обеспечивает решение этой проблемы с помощью веб-службы JSON (http://api.metacpan.org).
Легко попробовать разные запросы, используя curl
в командной строке или через веб-форму на http://explorer.metacpan.org/
Если вы знаете название нужного вам релиза,
Вы можете сделать запрос, подобный этому, чтобы получить список имен модулей:
/module/_search
{
"query" : { "match_all" : {} },
"size" : 1000,
"fields" : [ "module.name" ],
"filter" : {
"and": [
{ "term" : { "module.authorized" : true } },
{ "term" : { "module.indexed" : true } },
{ "term" : { "release" : "XML-LibXML-1.95" } },
{ "term" : { "status" : "latest" } }
]
}
}
Вы также можете заменить "release": "XML-LibXML-1.95"
на "distribution": "XML-LibXML"
.
Если вы начинаете с имени модуля и вам необходимо сначала определить имя выпуска, попробуйте следующее:
/module/_search
{
"query" : { "match_all" : {} },
"size" : 1000,
"fields" : [ "release", "distribution" ],
"filter" : {
"and": [
{ "term" : { "module.name" : "XML::LibXML" } },
{ "term" : { "status" : "latest" } }
]
}
}
Синтаксис этого запроса - ElasticSearch DSL, поскольку API использует ElasticSearch для индексации данных.
Для выполнения запроса из Perl существует MetaCPAN :: API
модуль, хотя я не использовал его сам.
Поскольку это всего лишь веб-запрос, вы можете использовать LWP или любой другой HTTP-модуль.
Возможно, вы захотите проверить
ElasticSearch и
ElasticSearch :: SearchBuilder
модули, обеспечивающие более полный Perl-интерфейс для запросов к базе данных ElasticSearch.
Вот полный пример использования Perl с использованием LWP:
use JSON qw( encode_json decode_json );
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->post("http://api.metacpan.org/module/_search",
Content => encode_json({
query => { match_all => {} },
size => 1000,
# limit reponse text to just the module names since that's all we want
fields => ['module.name'],
filter => {
and => [
{ term => { "module.authorized" => 1 } },
{ term => { "module.indexed" => 1 } },
{ term => { "distribution" => "XML-LibXML" } },
{ term => { "status" => "latest" } }
]
}
})
);
my @modules =
# this can be an array (ref) of module names for multiple packages in one file
map { ref $_ ? @$_ : $_ }
# the pieces we want
map { $_->{fields}{'module.name'} }
# search results
@{ decode_json($res->decoded_content)->{hits}{hits} };
print join "\n", sort @modules;
Для получения дополнительной помощи посетите #metacpan
на irc.perl.org
,
или посмотрите вики на https://github.com/CPAN-API/cpan-api/wiki.
Если вы немного больше объясните, что вы делаете и / или пытаетесь достичь, вы можете найти другие способы сделать это.