狐の王国

人は誰でも心に王国を持っている。

ちょっとわかりにくいCPAN.pmのAPI

IRCCPANの情報を取得したいんだけどみたいな話になってちょっと調べてみた。

CPAN::API:HOWTO(3)に少し書いてあるのだが、ホントにちょっとしか書いてないので実際の使い方はCPAN(3)やCPAN.pmのソースを読まないとわからなそう。

というわけで調べた結果をメモ的に。

use CPAN;
my $mod = CPAN::Shell->expand('Module', 'Data::Dumper');


基本的にはこんな感じで情報を取得する。$modの中身を見てみると、

use CPAN;
use Data::Dumper;
my $mod = CPAN::Shell->expand('Module', 'Data::Dumper');
print Dumper($mod);
CPAN: Storable loaded ok
Going to read /home/koshian/.cpan/Metadata
  Database was generated on Mon, 22 Sep 2008 00:02:47 GMT
$VAR1 = bless( {
                 'ID' => 'Data::Dumper',
                 'RO' => {
                           'userid' => 'GSAR',
                           'stats' => 'd',
                           'description' => 'Convert data structure into perl code',
                           'stati' => 'O',
                           'CPAN_VERSION' => '2.121',
                           'CPAN_FILE' => 'I/IL/ILYAM/Data-Dumper-2.121.tar.gz',
                           'chapterid' => '6',
                           'CPAN_USERID' => 'ILYAM',
                           'statd' => 'S',
                           'statl' => 'p',
                           'statp' => 'p'
                         }
               }, 'CPAN::Module' );

と、こんな感じ。

作者の情報なんかは入ってないし、ファイルもホスト名が無いのでこのままじゃ取得できない。

ホスト名はcpanの設定ファイルから取得可能。

foreach my $site(@{$CPAN::Config->{urllist}}) {
    print $site . $mod->{RO}->{CPAN_FILE};
}

こんな感じで設定ファイルに書かれたミラーリストを利用して完全なURLを取得できる。

作者の情報のほうはというと、以下のようにして取得可能。

my $author = $CPAN::META->instance("CPAN::Author", $mod->{RO}->{CPAN_USERID})

CPAN(3)にあるCPAN::Authorのメソッドを使って情報を取得できる。

use CPAN;
use Data::Dumper;
my $mod = CPAN::Shell->expand('Module', 'Data::Dumper');
my $author = $CPAN::META->instance("CPAN::Author", $mod->{RO}->{CPAN_USERID});

print
    "as_glimpse():\n",
    $author->as_glimpse(),"\n\n",
    "as_string():\n",
    $author->as_string(),"\n\n",
    "email():\n",
    $author->email(),"\n\n",
    "fullname():\n",
    $author->fullname(),"\n\n",
    "name():\n",
    $author->name(),"\n\n";

というか調べたはいいけど応用思い付かんな。何に使おう。

Sugano `Koshian' Yoshihisa(E) <koshian@foxking.org>