mcpan - ¿Cómo puedo saber si un módulo Perl es el núcleo o parte de la instalación estándar?
perl modules (7)
El comando de la lista de Module::CoreList módulo Module::CoreList determinará si un módulo es Core o no.
> corelist Carp
Carp was first release with perl 5
> corelist XML::Twig
XML::Twig was not in CORE (or so I think)
Aquí hay una manera de usarlo en un script. El Module::CoreList
POD es demasiado escueto: tienes que buscar el código fuente para encontrar qué métodos llamar:
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
¿Cómo puedo verificar si un módulo de Perl es parte del núcleo, es decir, es parte de la instalación estándar?
Estoy buscando:
- un comando de línea de comandos:
- una subrutina / función de Perl para verificar dentro del código
Quizás la pregunta debería ser: ¿cómo puedo saber qué módulos se proporcionaron originalmente con la instalación específica de Perl en una máquina? (En realidad, ahora se pregunta cómo puedo saber qué módulos se proporcionaron originalmente con la instalación específica de Perl en una máquina? ).
Dado que ahora parece que no hay una instalación estándar general de Perl, al menos la respuesta a esta nueva pregunta me dirá qué tenía originalmente en la instalación cuando se instaló por primera vez.
Con ese conocimiento y si guardo la imagen / paquete original del instalador O sé cómo obtener exactamente lo mismo en línea, entonces tengo una instalación repetible de Perl para varias máquinas con el conocimiento de qué módulos estarán presentes y qué módulos no.
Para aclarar más: estoy mirando lo que vino originalmente con la instalación, qué módulos se proporcionaron como parte de esa instalación, y qué estaba incorporado. NO lo que se ha instalado desde entonces.
Y quiero poder hacer esto en la máquina que tiene la instalación . Así que para esto confiaría en la instalación para tener un registro de alguna forma en cuanto a lo que tiene originalmente.
Formulé una pregunta indirecta: ¿cómo puedo saber qué módulos se proporcionaron originalmente con la instalación específica de Perl en una máquina? (¿Cómo puedo saber qué módulos se proporcionaron originalmente con la instalación específica de Perl en una máquina?)
En una respuesta a un comentario de Gbacon, dices que quieres que la respuesta sea neutral en la plataforma. No sé de esa solución, pero me pregunto si es la forma correcta de hacerlo.
Si su objetivo es averiguar en máquinas específicas, usaría las herramientas que vienen con la plataforma. En Debian, eso incluiría dpkg
(preinstalado en cualquier sistema Debian) o apt-file
(no necesariamente preinstalado) u otras herramientas APT
.
Como ejemplo, eche un vistazo a la salida de esto:
dpkg-query -L perl | less
Obviamente, es necesario analizar la salida, pero me parece un comienzo precisamente porque es específico de la máquina en cuestión.
Para los realmente vagos, está la lista de Módulos principales en el sitio web perldoc.perl.org.
Puede usar (por ejemplo, buscar Net::FTP
):
perl -MNet::FTP -e 1
Si no tiene salida, entonces está instalado.
Otros recursos
perldoc perlmodlib
perldoc perllocal
Realmente ya no existe el "núcleo". Solía haber una distribución estándar de Perl, pero muchas personas no tienen una distribución estándar de Perl. Las distribuciones del sistema operativo lo modifican agregando o eliminando módulos, cambiando módulos, y así sucesivamente. No puede confiar en que la distribución estándar sea realmente estándar. Algunas distribuciones de Linux ni siquiera incluyen la documentación Perl como parte de la instalación base de Perl.
Menciona que no puede usar Module::CoreList porque no es core, pero si puede crear archivos, puede instalar el módulo. Incluso puede pretender que lo escribió usted mismo.
Usted podría verificar perlmodlib
en un 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 : ();
}
Ejemplo de uso:
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";
}
Salida:
$ ./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
es definitivamente parte del verdadero núcleo y la instalación estándar de Perl. La distribución fuente para perl-5.10.1, por ejemplo, contiene
-
perldoc.PL
, generaperldoc
como parte de la instalación estándar -
perlmodlib.PL
, generaperlmodlib.pod
como parte de la instalación estándar
Esta no es una nueva adición. Perl-5.6.0, de unos diez años, tenía perlmodlib
como parte de su instalación estándar de verdadero núcleo.
Las instalaciones que no contienen estos elementos no son estándar. Sí, agradezco que pueda parecer académico desde su punto de vista, pero el embalaje de su proveedor permitió una instalación no estándar que rompe programas que de otro modo funcionarían.
Con el administrador de paquetes de Debian, puede obtener la instalación estándar de Perl con
$ apt-get --install-recommends install perl
Desde la línea de comandos:
Digamos que desea saber si el módulo
Tie::Hash
está instalado.
Para averiguarlo, ejecute lo siguiente desde la línea de comando:perl -MTie::Hash -e 1
Si no obtiene ningún resultado del comando anterior, entonces el módulo está instalado; si obtiene un error, no está instalado.
Para realizar esta comprobación desde el script, puede utilizar Module::Load::Conditional .