Как я могу проверить, является ли модуль Perl частью ядра - т.е. это - часть стандартной установки?
Я ищу:
Возможно, вопрос должен быть: Как я могу сказать, каким модулям первоначально предоставили определенную установку Perl на машине? (На самом деле теперь просят как, Как я могу сказать, каким модулям первоначально предоставили определенную установку Perl на машине?.)
Учитывая, что там теперь, кажется, чтобы не быть полной установкой стандарта Perl, по крайней мере, ответ на этот новый вопрос скажет мне, что я первоначально имел в установке, когда это было сначала установлено.
С тем знанием и если я сохраняю исходное изображение/пакет установщика ИЛИ знаю, как получить точную вещь снова онлайн, затем у меня есть повторяемая установка Perl для нескольких машин со знанием того, какие модули будут присутствовать и какие модули не будут.
Разъясниться далее: Я смотрю на то, что шло с установкой первоначально, какие модули были обеспечены как часть той установки, и что было встроено. НЕ, что было установлено с тех пор.
И я хочу смочь сделать это на машине, которая имеет установку. Таким образом для этого я положился бы на установку, чтобы иметь запись в некоторой форме относительно того, что она имеет первоначально.
Я задал вопрос ответвления: Как я могу сказать, каким модулям первоначально предоставили определенную установку Perl на машине? (Как я могу сказать, каким модулям первоначально предоставили определенную установку Perl на машине?)
Команда 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
Вы можете использовать (например, поиск Net :: FTP
):
perl -MNet::FTP -e 1
Если у него нет вывода, то он установлен.
perldoc perlmodlib
perldoc perllocal
Из командной строки:
Допустим, ты хочешь знать.
является ли модуль Tie::Hash
установленный.
Чтобы выяснить это, выполните
из командной строки:
perl -MTie::Hash -e 1
Если вы не получите никакого вывода из вышеприведенной команды, то модуль будет установлен; если вы получите ошибку, то он не будет установлен.
Для выполнения этой проверки из скрипта можно использовать Module::Load::Conditional.
Можно проверить 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
На самом деле нет такой вещи, как «ядро» больше. Раньше было стандартное распространение Perl, но у многих людей нет стандартного распространения PERL. Дистрибутивы операционной системы изменяют его либо добавлением или удалением модулей, изменяющих модули и так далее. Вы не можете полагаться на стандартное распределение на самом деле стандартным. Некоторые дистрибутивы Linux даже не включают в себя документацию Perl как часть установки Base Perl.
Вы упоминаете, что вы не можете использовать модуль :: Corelist , потому что это не ядро, но если вы можете создавать файлы, вы можете установить модуль. Вы даже можете притворяться, что вы написали это сами.
Для этого не существует собственного метода. Вам придется сделать это вручную.
Первый шаг состоит в том, чтобы решить, насколько глубоко вы хотите, чтобы копия была парной. Вы хотите, чтобы отдельный объект словарной статьи содержал ссылки на общие ключи и значения, или вы хотите, чтобы все было скопировано. Если последнее, они должны реализовать 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
Очевидно, что вам нужно проанализировать вывод, но он поражает меня как начало именно потому, что он специфичен для рассматриваемой машины.