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

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

Я ищу:

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

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

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

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

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

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

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

Ответы [ 7 ]

60 голосов
/ 12 января 2010

Команда 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)

Вот один из способов использовать его в скрипте. 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
8 голосов
/ 13 января 2010

На самом деле больше нет понятия «ядро». Раньше был стандартный дистрибутив Perl, но у многих людей нет стандартного дистрибутива Perl. Дистрибутивы операционной системы модифицируют его, добавляя или удаляя модули, меняя модули и так далее. Нельзя полагаться на то, что стандартный дистрибутив на самом деле является стандартным. Некоторые дистрибутивы Linux даже не включают документацию Perl как часть базовой установки Perl.

Вы упоминаете, что не можете использовать Module :: CoreList , потому что это не ядро, но если вы можете создавать файлы, вы можете установить модуль. Вы даже можете притвориться, что написали это сами.

7 голосов
/ 12 января 2010

Вы можете проверить 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
3 голосов
/ 12 января 2010

Для действительно ленивых есть список Core Modules на сайте perldoc.perl.org.

1 голос
/ 12 января 2010

Вы можете использовать (например, поиск для Net::FTP):

perl -MNet::FTP -e 1

Если у него нет вывода, значит, он установлен.

Другие ресурсы

perldoc perlmodlib 
perldoc perllocal

Узел из перлмонков

0 голосов
/ 17 января 2010

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

Если ваша цель - узнать на конкретных машинах, я бы использовал инструменты, поставляемые с платформой. В Debian это будет включать dpkg (предварительно установленный в любой системе Debian) или apt-file (предварительно не установленный) или другие APT инструменты.

В качестве примера рассмотрим вывод этого:

dpkg-query -L perl | less

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

0 голосов
/ 12 января 2010
  • Из командной строки:

    Допустим, вы хотите знать является ли модуль Tie::Hash установлены.
    Чтобы узнать, выполнить следующее из командной строки:

    perl -MTie::Hash -e 1
    

    Если вы не получили никакого вывода из вышеприведенной команды, то модуль установлен; если вы получили ошибку, она не установлена.

  • Для выполнения этой проверки из скрипта вы можете использовать Module :: Load :: Conditional .

...