Подтвердить что ты не робот

Как я могу определить, является ли модуль Perl основным или частью стандартной установки?

Как проверить, является ли модуль Perl частью ядра - то есть он является частью стандартной установки?

Я ищу:

  • команда командной строки:
  • Подпрограмма/функция Perl для проверки внутри кода

Возможно, вопрос должен быть следующим: как я могу узнать, какие модули изначально были предоставлены с конкретной установкой Perl на машине? (На самом деле, теперь его спрашивают как Как я могу узнать, какие модули были первоначально предоставлены с конкретной установкой Perl на машине?.

Учитывая, что теперь, похоже, не будет стандартной стандартной установки Perl, по крайней мере, ответ на этот новый вопрос скажет мне, что я изначально имел при установке, когда она была впервые установлена.

С этими знаниями, и если я сохраню исходный образ/пакет установщика или узнаю, как снова получить точную информацию в Интернете, то у меня есть повторяющаяся установка Perl для нескольких машин с учетом того, какие модули будут присутствовать и какие модули будут не.

Чтобы прояснить далее: я смотрю, что первоначально было с установкой, какие модули были предоставлены как часть этой установки и что было встроено. НЕ то, что было установлено с тех пор.

И я хочу, чтобы это можно было сделать на машине с установленной установкой. Поэтому для этого я буду полагаться на установку, чтобы иметь запись в той или иной форме относительно того, из чего она была первоначально.

Я задал вопрос: Как я могу узнать, какие модули были первоначально предоставлены с конкретной установкой Perl на машине? (Как я могу узнать, какие модули были первоначально предоставлены с помощью конкретной установки Perl на машине?)

4b9b3361

Ответ 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

Ответ 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

Очевидно, вам нужно будет разобрать вывод, но он ставит меня как начало именно потому, что он специфичен для рассматриваемой машины.