|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Mikhail V. Basov 2:5020/400 15 Mar 2002 21:47:30 To : All Subject : Определить версии установленных в системе модулей --------------------------------------------------------------------------------
Hi All,
Как определить версии установленных в системе модулей?
По работе для администрирования приходится писать некоторое количество
скриптов на Perl. Очень часто возникают глюки связаные с неудачной комбинацией
версий модулей установленных в системе (свежий пример XML::Twig). Хотелось бы
написать скрипт печатающий список модулей и их версий установленных в системе.
Получить список модулей - не проблема. Идея пробегала здесь недавно:
рекурсивно пройти по каталогам указанным в @INC и найти все файлы с
расширением .pm. Определить версию пары-тройки модулей тоже не проблема.
Загрузить, вызвать $mod_name::VERSION. Проблема в том что если попытаться
загрузить _ВСЕ_ модули установленные в системе - с большой вероятностью
получаем Segmentation fault.
Собственно более узкая задача формулируется так: Как загрузить модуль
(безопасно - если не загрузился - скрипт не прерывается) и затем его
гарантированно выгрузить освободив память. 'no mod_name' почему-то не
срабатывает.
Hаработки:
-----------------------------------------------------------------------------
#!/usr/bin/perl
use File::Find;
my (@mod, %done, $dir);
find(\&get, grep { -r and -d } @INC);
@mod = grep(!$done{$_}++, @mod);
foreach $dir (sort { length $b <=> length $a } @INC) {
foreach (@mod) { next if s,^\Q$dir,,; }
}
print "Content-type: text/html\n\n";
foreach (sort @mod) { s,^/(.*)\.pm$,$1,; s,/,::,g; load_mod($_); }
print "Done! ($#mod modules!)\n\n";
sub get { /^.*\.pm$/ && /$ARGV[0]/i && push @mod, $File::Find::name; }
sub load_mod {
my ($mod) = @_;
print "load $mod : ";
if ( ! eval "use $mod" ) {
print "version ". ${${mod}.'::VERSION'}."\n";
eval "no $mod";
} else {
warn "!!! couldn't load $mod: $@\n";
}
return;
}
-----------------------------------------------------------------------------
Михаил Басов
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/166797ebb0e9a.html, оценка из 5, голосов 10
|