frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

CPANモジュールのバージョン一覧。

サーバーが沢山あるので、どのサーバーに、

どのバージョンのCPANモジュールが入ってるのか、わからない状況。

てな訳で、それは非常にデンジャーなので

バージョン調べる方法を検討してたらば。

perldoc perllocal は見難い上に

podだからか、なんだか表示が遅い。

かくして、面倒だから直接 perllocal.pod から

必要なところだけ読み込んでみた。

これでいいのか、まだ実際の環境で試してないけど

超適当に書いたので、メモ。

open IN, '-|' とかやらずに、`` 使ってるのは、面倒だからです。真似しないでねー。

#!/usr/bin/perl -w

use strict;

# ----------------------------------------------------------------

# main

# ----------------------------------------------------------------

if (&_searchPerllocal() == 0) {

die("can't open perlocal file");

}

exit;

# ----------------------------------------------------------------

# function

# ----------------------------------------------------------------

sub _searchPerllocal() {

my @perllocalPath = `find \`perl -e 'print "@INC"'\` -type f -name perllocal.pod | uniq`;

foreach my $path (@perllocalPath) {

chomp $path;

print "${path}\n";

return 0 if ! &_getModuleInfo($path);

}

return 1;

}

sub _getModuleInfo($) {

my $perllocalPath = shift;

open IN, $perllocalPath || return 0;

my $moduleName = '';

my %moduleInfo = ();

while (<IN>) {

next if ! /C<(Module)> L<([^|]+)/ && ! /C<(VERSION): ([^>]+)/;

if ($1 eq 'Module') {

$moduleName = $2;

} else {

$moduleInfo{$moduleName}= $2;

}

}

close IN;

&_showModuleVersion(\%moduleInfo);

return 1;

}

sub _showModuleVersion(\%) {

my $refModuleInfo = shift;

foreach my $moduleName (sort {$a cmp $b} keys %{$refModuleInfo}) {

printf "%-30s\t%s\n", $moduleName, $refModuleInfo->{$moduleName};

}

}

# end of this script