Вопрос:
Помимо попыток
perldoc <module name>
индивидуально для любого модуля CPAN, который принимает мою фантазию или проходит через файловую систему и смотрит на каталоги, я понятия не имею, какие модули мы установили.
Какой самый простой способ получить большой список каждого модуля CPAN? Из командной строки или иначе.
Лучший ответ:
Это ответ на часто задаваемые вопросы в Perl, ответ, который можно быстро найти с помощью perldoc -q installed. Короче говоря, это сводится к использованию ExtUtils::Installed или использованию File::Find, варианты обоих из которых были рассмотрены ранее в этом потоке.
Вы также можете найти запись в FAQ “Как узнать, какие модули установлены в моей системе?” в perlfaq3. Вы можете просмотреть список ответов на часто задаваемые вопросы, просмотрев perlfaq
Ответ №1perldoc perllocal
Изменить: там (немного) больше информации об этом в CPAN FAQ
Ответ №2
perldoc -q installed
утверждает, что cpan -l выполнит трюк, однако он не работает для меня. Другой вариант:
cpan -a
выводит хороший список установленных пакетов и имеет хороший побочный эффект для их записи в файл.
Ответ №3
Стоит отметить, что perldoc perllocal будет сообщать только о модулях, установленных через CPAN. Если кто-то устанавливает модули вручную, он их не найдет. Кроме того, если у вас несколько человек, устанавливающих модули, а perllocal.pod находится под контролем источника, люди могут неправильно разрешать конфликты и испортить список (например, это произошло здесь, например, на работе).
К сожалению, решение, похоже, проходит через @INC с File:: Find или что-то подобное. Однако это не просто находит модули, но и находит связанные модули в дистрибутиве. Например, он будет сообщать TAP:: Harness и TAP:: Parser в дополнение к фактическому имени распространения Test:: Harness (если у вас есть версия 3 или выше). Вы могли бы сопоставить их с именами дистрибутивов и отбросить те имена, которые не совпадают, но тогда вы можете отказаться от локально построенных и установленных модулей.
Я полагаю, что работа по индексированию brian d foy backpan должна иметь код для передачи файла в формате .pm, и он попытается сделать вывод о распределении, но даже это время не получается, потому что в пакете необязательно установлена (см. Devel:: Cover:: Inc для примера).
Ответ №4
Вы можете попробовать 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 вокруг списка.
Удачи,
Ответ №5$ 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 %sn» «$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» Ответ №6
Здесь 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 Ответ №7
Мне нравится использовать команду CPAN ‘r’ для этого. Вы можете попасть в оболочку CPAN со старым стилем:
sudo perl -MCPAN -e shell
или в большинстве новых систем есть команда cpan, поэтому эта команда приведет вас к оболочке:
sudo cpan
(Обычно вам нужно использовать “sudo” для запуска его как root или использовать “su -“, чтобы стать root, прежде чем запускать его, если у вас нет настройки cpan, чтобы вы могли запускать ее как обычный пользователь, но установите как root.Если у вас нет root на этом компьютере, вы все равно можете использовать оболочку CPAN, чтобы узнать эту информацию, но вы не сможете устанавливать модули, и вам, возможно, придется пройти немного по настройке при первом запуске.)
Затем, когда вы находитесь в оболочке cpan, вы можете использовать команду “r”, чтобы сообщать обо всех установленных модулях и их версиях. Итак, в приглашении “cpan > ” введите “r”. В нем будут перечислены все установленные модули и их версии. Использовать ‘?’ чтобы получить дополнительную помощь.
Ответ №8
Здесь действительно хакерский способ сделать это в * 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; } } Ответ №9
Вы можете получить список модулей perl, установленных в вашей системе, с помощью команды instmodsh в вашем терминале. Он попросит вас три варианта, чтобы увеличить вывод:
l — List all installed modules m <module> — Select a module q — Quit the program Ответ №10perl -MFile::Find=find -MFile::Spec::Functions -Tlwe ‘find { wanted => sub { print canonpath $_ if /.pmz/ }, no_chdir => 1 }, @INC’ Ответ №11
Ответ можно найти в Perl FAQ.
Вам следует отказаться от отличной документации, которая поставляется с Perl
perldoc perltoc Ответ №12
Попробуйте man perllocal или perldoc perllocal.
Ответ №13
Попробуйте выполнить следующую команду
instmodsh
Ответ №14
В Linux/Unix я использую эту простую команду:
perl -e ‘print qx/find $_ -name «*.pm»/ foreach ( @INC );’
Он сканирует все папки в @INC и ищет любой файл *.pm.
Ответ №15
Чтобы пройти через деревья каталога @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) в качестве значения ключа вместо количества просмотренных раз.
Ответ №16
Я написал 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 можно найти здесь.
Ответ №17
Вот еще один инструмент командной строки для списка всех установленных файлов .pm:
Найти установленные модули Perl, соответствующие регулярному выражению
- Portable (использует только модули ядра)
- Параметр кэша для быстрого поиска
- Конфигурируемые параметры отображения
Ответ №18
Я могу предложить использовать pmtools, особенно pminst, который принимает регулярные выражения.
Ответ №19
Здесь находится однострочный Perl, который будет распечатывать список установленных модулей:
perl -MExtUtils::Installed -MData::Dumper -e ‘my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());’
Просто убедитесь, что у вас установлен Data:: Dumper.
Ответ №20
perl-pmtools – хороший инструмент для вас.
Ответ №21
кулинарная книга Perl содержит несколько итераций script “pmdesc”, которая делает то, что вы хотите.
Google-поиск “Perl Cookbook pmdesc”, и вы найдете статьи на других сайтах Q & A, несколько списков кодов в сети, обсуждение решения и даже некоторые уточнения.
Ответ №22cd /the/lib/dir/of/your/perl/installation perldoc $(find . -name perllocal.pod)
Пользователи Windows просто выполняют поиск проводника Windows, чтобы найти его.
Ответ №23
Следующие работали для меня.
$ perldoc perllocal | grep Module $ perldoc perllocal | grep -E ‘VERSION|Module’ Ответ №24
Попробуйте “perldoc -l”:
$ perldoc -l Log :: Dispatch
/usr/local/share/perl/5.26.1/Log/Dispatch.pm
Ответ №25
Всем тем, кто не может установить perldoc или другие модули и хочет знать, какие модули доступны (CPAN или иным образом), для linux и Mingw32/64 работает следующее:
grep -RhIP ‘^package [A-Z][w:]+;’ ‘perl -e ‘print join » «,@INC» | sed ‘s/package //’ | sort | uniq
Да, это грязно. Да, это, вероятно, сообщает больше, чем вы хотите. Но если вы передадите его в файл, вы можете легко проверить, скажем, какие интерфейсы dbm присутствуют:
grep -RhIP ‘^package [A-Z][w:]+;’ ‘perl -e ‘print join » «,@INC» | sed ‘s/package //’ | sort | uniq > modules-installed cat modules-installed | grep -i dbm AnyDBM_File; Memoize::AnyDBM_File; Memoize::NDBM_File; Memoize::SDBM_File; WWW::RobotRules::AnyDBM_File;
Именно поэтому я попал на эту страницу (разочарован)
(Я понимаю, что это не дает точного ответа на вопрос OP, но я публикую его для всех, кто попал сюда по той же причине, что и я. То, что проблема со стеком ***, почти невозможно найти вопрос, который вы задаете, даже если он существует, но стек *** почти всегда является хитом Google!)
Ответ №26
Использовать perldoc -q для получения дополнительной информации
или Просто введите
perldoc <Module::Name> Ответ №27
Когда вы вводите свой Perl script, у вас есть все установленные модули в виде файлов .pm под папками в @INC, поэтому небольшой bash script выполнит эту работу для вас:
#!/bin/bash echo -e -n «Content-type: text/plainnn» inc=`perl -e ‘$, = «n»; print @INC;’` for d in $inc do find $d -name ‘*.pm’ done Ответ №28
Для Linux самый простой способ получить –
dpkg -l | grep «perl» Ответ №29
Это работает для меня
perl -e ‘print join(«n»,@INC,»»)’