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

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

Я ищу:

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

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

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

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

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

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

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

54
задан Community 23 May 2017 в 02:18
поделиться

7 ответов

Команда corelist из модуля Module::CoreList определит, является ли модуль CoreList ядром или нет.

> 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
61
ответ дан 7 November 2019 в 08:04
поделиться

Для действительно ленив есть список основных модулей на веб-сайте perldoc.perl.org.

3
ответ дан 7 November 2019 в 08:04
поделиться

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

perl -MNet::FTP -e 1

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

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

perldoc perlmodlib 
perldoc perllocal

Узел от Perlmonks

1
ответ дан 7 November 2019 в 08:04
поделиться
  • Из командной строки:

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

    perl -MTie::Hash -e 1
    

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

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

0
ответ дан 7 November 2019 в 08:04
поделиться

Можно проверить perlmodlib в sub:

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
8
ответ дан 7 November 2019 в 08:04
поделиться

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

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

8
ответ дан 7 November 2019 в 08:04
поделиться

Для этого не существует собственного метода. Вам придется сделать это вручную.

Первый шаг состоит в том, чтобы решить, насколько глубоко вы хотите, чтобы копия была парной. Вы хотите, чтобы отдельный объект словарной статьи содержал ссылки на общие ключи и значения, или вы хотите, чтобы все было скопировано. Если последнее, они должны реализовать ICloneable для создания метода общего назначения.

-121--2257091-
# Rewrite Rules for example.com
RewriteEngine On
RewriteBase /

# Redirect from example.com to www.example.com
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# Disable SSL on pages other than payments.php
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^payments\.php$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

# Require SSL on payments.php
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} ^payments\.php$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Я не тестировал его, но что-то подобное должно работать

Изменить: Обновить

-121--2839528-

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

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

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

dpkg-query -L perl | less

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

0
ответ дан 7 November 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: