Помимо попыток
perldoc <module name>
индивидуально для любого модуля CPAN, который принимает мою фантазию или проходит через файловую систему и смотрит на каталоги, я понятия не имею, какие модули мы установили.
Какой самый простой способ получить большой список каждого модуля CPAN? Из командной строки или иначе.
Это ответ на часто задаваемые вопросы в Perl, ответ, который можно быстро найти с помощью perldoc -q installed
. Короче говоря, это сводится к использованию ExtUtils::Installed
или использованию File::Find
, варианты обоих из которых были рассмотрены ранее в этом потоке.
Вы также можете найти запись в FAQ "Как узнать, какие модули установлены в моей системе?" в perlfaq3. Вы можете просмотреть список ответов на часто задаваемые вопросы, просмотрев perlfaq
cpan -l
первая запись в perldoc -q installed
команде perldoc -q installed
.
perldoc perllocal
Изменить: там (немного) больше информации об этом в CPAN FAQ
Стоит отметить, что perldoc perllocal будет сообщать только о модулях, установленных через CPAN. Если кто-то устанавливает модули вручную, он их не найдет. Кроме того, если у вас несколько человек, устанавливающих модули, а perllocal.pod находится под контролем источника, люди могут неправильно разрешать конфликты и испортить список (например, это произошло здесь, например, на работе).
К сожалению, решение, похоже, проходит через @INC с File:: Find или что-то подобное. Однако это не просто находит модули, но и находит связанные модули в дистрибутиве. Например, он будет сообщать TAP:: Harness и TAP:: Parser в дополнение к фактическому имени распространения Test:: Harness (если у вас есть версия 3 или выше). Вы могли бы сопоставить их с именами дистрибутивов и отбросить те имена, которые не совпадают, но тогда вы можете отказаться от локально построенных и установленных модулей.
Я полагаю, что работа по индексированию brian d foy backpan должна иметь код для передачи файла в формате .pm, и он попытается сделать вывод о распределении, но даже это время не получается, потому что в пакете необязательно установлена (см. Devel:: Cover:: Inc для примера).
perldoc -q installed
утверждает, что cpan -l
выполнит трюк, однако он не работает для меня. Другой вариант:
cpan -a
выводит хороший список установленных пакетов и имеет хороший побочный эффект для их записи в файл.
cpan -l
работает (или работает для меня с CPAN v2.05). cpan -a
действительно красивее.
Вы можете попробовать ExtUtils-Installed, но это выглядит только в .packlist
s, поэтому он может пропустить модули, в которые люди перемещали вещи в @INC
вручную.
Я написал App-Module-Lister для друга, который хотел сделать это как CGI script на учетной записи хостинга без оболочки. Вы просто берете файл модуля и загружаете его как имя файла, которое ваш сервер будет рассматривать как CGI script. У него нет зависимостей вне стандартной библиотеки. Используйте его как есть или украдите код.
Он выводит список модулей и их версий:
Tie::Cycle 1.15 Tie::IxHash 1.21 Tie::Toggle 1.07 Tie::ToObject 0.03 Time::CTime 99.062201 Time::DaysInMonth 99.1117 Time::Epoch 0.02 Time::Fuzzy 0.34 Time::JulianDay 2003.1125 Time::ParseDate 2006.0814 Time::Timezone 2006.0814
Я хотел бы добавить это как функцию в инструмент cpan
, поэтому я тоже это сделаю. [Время проходит] И теперь у меня есть переключатель -l
в cpan
. У меня есть несколько других вещей, связанных с этим, прежде чем я выпущу релиз, но он в GitHub. Если вы не хотите ждать этого, вы можете просто попробовать переключатель -a
, чтобы создать автозагрузку, хотя это добавляет некоторый Pod вокруг списка.
Удачи,
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort
Class::Inspector * "VERSION: 1.28"
Crypt::CBC * "VERSION: 2.33"
Crypt::Rijndael * "VERSION: 1.11"
Data::Dump * "VERSION: 1.22"
DBD::Oracle * "VERSION: 1.68"
DBI * "VERSION: 1.630"
Digest::SHA * "VERSION: 5.92"
ExtUtils::MakeMaker * "VERSION: 6.84"
install * "VERSION: 6.84"
IO::SessionData * "VERSION: 1.03"
IO::Socket::SSL * "VERSION: 2.016"
JSON * "VERSION: 2.90"
MIME::Base64 * "VERSION: 3.14"
MIME::Base64 * "VERSION: 3.14"
Mozilla::CA * "VERSION: 20141217"
Net::SSLeay * "VERSION: 1.68"
parent * "VERSION: 0.228"
REST::Client * "VERSION: 271"
SOAP::Lite * "VERSION: 1.08"
Task::Weaken * "VERSION: 1.04"
Term::ReadKey * "VERSION: 2.31"
Test::Manifest * "VERSION: 1.23"
Test::Simple * "VERSION: 1.001002"
Text::CSV_XS * "VERSION: 1.16"
Try::Tiny * "VERSION: 0.22"
XML::LibXML * "VERSION: 2.0108"
XML::NamespaceSupport * "VERSION: 1.11"
XML::SAX::Base * "VERSION: 1.08"
Здесь script, который выполнит трюк:
use ExtUtils::Installed;
my $inst = ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach $module (@modules){
print $module ." - ". $inst->version($module). "\n";
}
=head1 ABOUT
This scripts lists installed cpan modules using the ExtUtils modules
=head1 FORMAT
Prints each module in the following format
<name> - <version>
=cut
Perl - 5.10.1
Модули не перечислены.
Мне нравится использовать команду CPAN 'r' для этого. Вы можете попасть в оболочку CPAN со старым стилем:
sudo perl -MCPAN -e shell
или в большинстве новых систем есть команда cpan, поэтому эта команда приведет вас к оболочке:
sudo cpan
(Обычно вам нужно использовать "sudo" для запуска его как root или использовать "su -", чтобы стать root, прежде чем запускать его, если у вас нет настройки cpan, чтобы вы могли запускать ее как обычный пользователь, но установите как root.Если у вас нет root на этом компьютере, вы все равно можете использовать оболочку CPAN, чтобы узнать эту информацию, но вы не сможете устанавливать модули, и вам, возможно, придется пройти немного по настройке при первом запуске.)
Затем, когда вы находитесь в оболочке cpan, вы можете использовать команду "r", чтобы сообщать обо всех установленных модулях и их версиях. Итак, в приглашении "cpan > " введите "r". В нем будут перечислены все установленные модули и их версии. Использовать '?' чтобы получить дополнительную помощь.
Здесь действительно хакерский способ сделать это в * nix, вы получите некоторые вещи, которые вам не очень нравятся (например: warnings:: register и т.д.), но он должен предоставить вам список каждого файла .pm доступный через perl.
for my $path (@INC) {
my @list = `ls -R $path/**/*.pm`;
for (@list) {
s/$path\///g;
s/\//::/g;
s/\.pm$//g;
print;
}
}
Вы можете получить список модулей perl, установленных в вашей системе, с помощью команды instmodsh
в вашем терминале. Он попросит вас три варианта, чтобы увеличить вывод:
l - List all installed modules
m <module> - Select a module
q - Quit the program
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
*.pm
модулю. Вы можете увидеть много дубликатов ...
Попробуйте выполнить следующую команду
instmodsh
Здесь находится однострочный Perl, который будет распечатывать список установленных модулей:
perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'
Просто убедитесь, что у вас установлен Data:: Dumper.
Попробуйте man perllocal
или perldoc perllocal
.
Ответ можно найти в Perl FAQ.
Вам следует отказаться от отличной документации, которая поставляется с Perl
perldoc perltoc
perl-pmtools - хороший инструмент для вас.
Вот еще один инструмент командной строки для списка всех установленных файлов .pm:
Найти установленные модули Perl, соответствующие регулярному выражению
Я написал perl script только вчера, чтобы сделать именно это. script возвращает список модулей perl, установленных в @INC, используя '::' в качестве разделителя. Вызовите script используя -
perl perlmod.pl
ИЛИ
perl perlmod.pl <module name> #Case-insensitive(eg. perl perlmod.pl ftp)
На данный момент script пропускает текущий каталог ('.'), так как у меня возникли проблемы с рекурсивными софт-ссылками, но вы можете включить его, изменив функцию grep в строке 17 из
grep { $_ !~ '^\.$' } @INC
просто,
@INC
script можно найти здесь.
Чтобы пройти через деревья каталога @INC без использования внешней программы, такой как ls (1), можно использовать модуль File::Find::Rule
, который имеет хороший декларативный интерфейс.
Кроме того, вы хотите отфильтровать дубликаты, если предыдущие версии Perl содержат одни и те же модули. Код для этого выглядит так:
#! /usr/bin/perl -l
use strict;
use warnings;
use File::Find::Rule;
my %seen;
for my $path (@INC) {
for my $file (File::Find::Rule->name('*.pm')->in($path)) {
my $module = substr($file, length($path)+1);
$module =~ s/.pm$//;
$module =~ s{[\\/]}{::}g;
print $module unless $seen{$module}++;
}
}
В конце прогона вы также имеете все имена модулей в качестве ключей в% hash. Код может быть адаптирован для сохранения канонического имени файла (заданного в $file) в качестве значения ключа вместо количества просмотренных раз.
Это работает для меня
perl -e 'print join("\n",@INC,"")'
Когда вы вводите свой Perl script, у вас есть все установленные модули в виде файлов .pm под папками в @INC, поэтому небольшой bash script выполнит эту работу для вас:
#!/bin/bash
echo -e -n "Content-type: text/plain\n\n"
inc=`perl -e '$, = "\n"; print @INC;'`
for d in $inc
do
find $d -name '*.pm'
done
find `perl -le'print for@INC'` -name '*.pm'
Следующие работали для меня.
$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
cd /the/lib/dir/of/your/perl/installation
perldoc $(find . -name perllocal.pod)
Пользователи Windows просто выполняют поиск проводника Windows, чтобы найти его.
кулинарная книга Perl содержит несколько итераций script "pmdesc", которая делает то, что вы хотите. Google-поиск "Perl Cookbook pmdesc", и вы найдете статьи на других сайтах Q & A, несколько списков кодов в сети, обсуждение решения и даже некоторые уточнения.
Для Linux самый простой способ получить -
dpkg -l | grep "perl"
Использовать perldoc -q для получения дополнительной информации или Просто введите
perldoc <Module::Name>
Это то, что я делаю: perl -M{cpan_module}
Если вы не получаете никаких ошибок, есть хороший шанс, что модуль будет установлен.