Как я могу определить, является ли модуль Perl основным или частью стандартной установки?
Как проверить, является ли модуль Perl частью ядра - то есть он является частью стандартной установки?
Я ищу:
- команда командной строки:
- Подпрограмма/функция Perl для проверки внутри кода
Возможно, вопрос должен быть следующим: как я могу узнать, какие модули изначально были предоставлены с конкретной установкой Perl на машине? (На самом деле, теперь его спрашивают как Как я могу узнать, какие модули были первоначально предоставлены с конкретной установкой Perl на машине?.
Учитывая, что теперь, похоже, не будет стандартной стандартной установки Perl, по крайней мере, ответ на этот новый вопрос скажет мне, что я изначально имел при установке, когда она была впервые установлена.
С этими знаниями, и если я сохраню исходный образ/пакет установщика или узнаю, как снова получить точную информацию в Интернете, то у меня есть повторяющаяся установка Perl для нескольких машин с учетом того, какие модули будут присутствовать и какие модули будут не.
Чтобы прояснить далее: я смотрю, что первоначально было с установкой, какие модули были предоставлены как часть этой установки и что было встроено. НЕ то, что было установлено с тех пор.
И я хочу, чтобы это можно было сделать на машине с установленной установкой. Поэтому для этого я буду полагаться на установку, чтобы иметь запись в той или иной форме относительно того, из чего она была первоначально.
Я задал вопрос:
Как я могу узнать, какие модули были первоначально предоставлены с конкретной установкой Perl на машине? (Как я могу узнать, какие модули были первоначально предоставлены с помощью конкретной установки Perl на машине?)
Ответы
Ответ 1
Команда corelist из Module:: CoreList будет определять, является ли модуль Core или нет.
> corelist Carp
Carp was first release with perl 5
> corelist XML::Twig
XML::Twig was not in CORE (or so I think)
Вот один из способов использовать его в script. Module::CoreList
POD слишком краткий - вам нужно отправиться на охоту через исходный код, чтобы найти, какие методы вызывать:
use strict;
use warnings;
use Module::CoreList;
my $mod = 'Carp';
#my $mod = 'XML::Twig';
my @ms = Module::CoreList->find_modules(qr/^$mod$/);
if (@ms) {
print "$mod in core\n";
}
else {
print "$mod not in core\n";
}
__END__
Carp in core
Ответ 2
На самом деле нет такой вещи, как "ядро". Раньше был стандартный дистрибутив Perl, но у многих людей нет стандартного дистрибутива Perl. Распределения операционной системы изменяют его путем добавления или удаления модулей, изменения модулей и т.д. Вы не можете полагаться на стандартное распределение, которое фактически является стандартным. Некоторые дистрибутивы Linux даже не включают документацию Perl как часть базовой установки Perl.
Вы упомянули, что вы не можете использовать Module:: CoreList, потому что это не ядро, но если вы можете создавать файлы, вы может установить модуль. Вы даже можете притвориться, что вы сами написали.
Ответ 3
Вы можете проверить perlmodlib
в суб:
my %_stdmod;
sub is_standard_module {
my($module) = @_;
unless (keys %_stdmod) {
chomp(my $perlmodlib = `perldoc -l perlmodlib`);
die "cannot locate perlmodlib\n" unless $perlmodlib;
open my $fh, "<", $perlmodlib
or die "$0: open $perlmodlib: $!\n";
while (<$fh>) {
next unless /^=head\d\s+Pragmatic\s+Modules/ ..
/^=head\d\s+CPAN/;
if (/^=item\s+(\w+(::\w+)*)/) {
++$_stdmod{ lc $1 };
}
}
}
exists $_stdmod{ lc $module } ? $module : ();
}
Пример использования:
die "Usage: $0 module..\n" unless @ARGV;
foreach my $mod (@ARGV) {
my $stdmod = is_standard_module $mod;
print "$0: $mod is ", ($stdmod ? "" : "not "), "standard\n";
}
Вывод:
$ ./isstdmod threads::shared AnyDBM_File CGI LWP::Simple
./isstdmod: threads::shared is standard
./isstdmod: AnyDBM_File is standard
./isstdmod: CGI is standard
./isstdmod: LWP::Simple is not standard
perldoc
наиболее определенно является частью истинного ядра и стандартной установки Perl. Например, распределение источников для perl-5.10.1 содержит
-
perldoc.PL
, генерирует perldoc
как часть стандартной установки
-
perlmodlib.PL
, генерирует perlmodlib.pod
как часть стандартной установки
Это не новое дополнение. Perl-5.6.0, около десяти лет, perlmodlib
как часть своей стандартной стандартной установки.
Установки, которые не содержат эти элементы, являются нестандартными. Да, я ценю, что это может показаться академическим с вашей точки зрения, но упаковка вашего поставщика разрешила нестандартную установку, которая нарушает работу других программ.
С менеджером пакетов Debian вы можете получить стандартную установку Perl с помощью
$ apt-get --install-recommends install perl
Ответ 4
Для действительно ленивого, Список основных модулей на веб-сайте perldoc.perl.org.
Ответ 5
Вы можете использовать (например, искать Net::FTP
):
perl -MNet::FTP -e 1
Если у него нет выхода, он устанавливается.
Другие ресурсы
perldoc perlmodlib
perldoc perllocal
A node от perlmonks
Ответ 6
-
Из командной строки:
Скажите, что вы хотите знать
является ли модуль Tie::Hash
установлен.
Чтобы узнать, выполните
из командной строки:
perl -MTie::Hash -e 1
Если вы не получите какой-либо вывод из приведенной выше команды, тогда модуль будет установлен; если вы получите сообщение об ошибке, оно не установлено.
-
Для выполнения этой проверки из script вы можете использовать Module:: Load:: Conditional.
Ответ 7
В ответ на комментарий Gbacon's вы говорите, что хотите, чтобы ответ был нейтральным платформой. Я не знаю такого решения, но мне интересно, даже если это правильный путь.
Если вы хотите узнать на конкретных машинах, я бы использовал инструменты, которые поставляются с платформой. В Debian, который будет включать dpkg
(предварительно установленный в любой системе Debian) или apt-file
(не предварительно установленный) или другие инструменты APT
.
В качестве примера рассмотрим вывод этого:
dpkg-query -L perl | less
Очевидно, вам нужно будет разобрать вывод, но он ставит меня как начало именно потому, что он специфичен для рассматриваемой машины.