metacpan - perl mcpan
¿Cómo encuentro el archivo cargado por Perl cuando uso un módulo? (10)
perl -M''LWP ''-e'' usa Data :: Dumper; imprimir Dumper /% INC ''| grep LWP
Esto mostrará una lista de la ubicación del módulo LWP en el disco y también enumerará los módulos cargados dentro de LWP.
''LWP.pm'' => ''/usr/lib/perl5/5.10.0/LWP.pm'',
''LWP/Protocol.pm'' => ''/usr/lib/perl5/5.10.0/LWP/Protocol.pm'',
''LWP/UserAgent.pm'' => ''/usr/lib/perl5/5.10.0/LWP/UserAgent.pm'',
en Perl, cuando use <module name> <ver>;
, el sistema encuentra el archivo .pm
para la biblioteca en algún lugar de la ruta @INC
.
¿Hay alguna manera confiable de cargar el archivo?
Aquí hay un trazador de líneas (con un contenedor bash) para determinar si un módulo está instalado y dónde se cargará desde:
#!/bin/bash
perl -M${1} -le "/$mname=/"${1}.pm/";/$mname=~s#::#/#g;print /"$1 INSTALLED AT /$INC{/$mname}/";" 2>/dev/null || echo "${1} NOT INSTALLED"
Llámalo con la sintaxis del nombre del módulo de Perl:
./find_perl_module Font::Metrics::Courier
Desea buscar en la variable %INC
, que registra el nombre de archivo que cargó para las bibliotecas que carga con do
, require
o use
. Ver perlvar para los detalles.
Hay una buena cantidad de módulos en CPAN para encontrar esta información, los candidatos más probables parecen ser Module :: Find, Module :: Which y Module :: Locate. Probablemente vaya con Module :: Locate:
use strict;
use warnings;
use Module::Locate qw/locate/;
my $to_find = "Some::Module";
print "Perl would use: ", scalar locate($to_find), "/n";
En el contexto de la lista, locate devuelve todas las copias encontradas de Some :: Module en orden basado en @INC.
Editar: derobert sugiere una manera mucho mejor , no me di cuenta de que% INC ya lo tenía ... Esta solución basada en módulos aún sería útil si quisiera saber antes de cargar el módulo desde donde se va a cargar.
Por lo que encontré, Perl buscará en los directorios dentro de la ruta:
perl -le ''print foreach @INC''
Luego se verá en la biblioteca estándar, y luego en el directorio actual.
Eso te da una orden de búsqueda.
Mi fuente:
Puede usar el comando instmodsh: http://perldoc.perl.org/instmodsh.html .
Sí, %INC
contiene la ruta completa de la que se cargó un módulo.
Ejemplo:
$ perl -M''Data::Dump qw(pp)'' -e ''pp(/%INC)''
{
"Data/Dump.pm" => "/usr/share/perl5/Data/Dump.pm",
"Exporter.pm" => "/usr/share/perl/5.10/Exporter.pm",
"List/Util.pm" => "/usr/lib/perl/5.10/List/Util.pm",
"Scalar/Util.pm" => "/usr/lib/perl/5.10/Scalar/Util.pm",
"XSLoader.pm" => "/usr/lib/perl/5.10/XSLoader.pm",
"overload.pm" => "/usr/share/perl/5.10/overload.pm",
"strict.pm" => "/usr/share/perl/5.10/strict.pm",
"vars.pm" => "/usr/share/perl/5.10/vars.pm",
"warnings.pm" => "/usr/share/perl/5.10/warnings.pm",
"warnings/register.pm" => "/usr/share/perl/5.10/warnings/register.pm",
}
Si el módulo tiene documentación de pod, y si puede garantizar que la utilidad perldoc en su RUTA pertenece al mismo perl que está ejecutando su secuencia de comandos, entonces este comando a menudo le dará el archivo real que se encuentra:
perldoc -l ModuleName
Uso el script de shell / usr / local / bin / which_perl_module
#!/bin/sh
if [ ! $1 ];then echo "Which perl module should I look for?"; exit; fi
echo -n "You are using: "
perldoc -l $1
echo "which I found by looking in:"
perl -MData::Dump=pp -e ''unshift @INC, ''$1''; pp(/@INC)''
Module::Mapper proporciona una forma de recorrer el árbol @INC para encontrar módulos:
perl -MModule::Mapper -MData::Dumper /
-e ''print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )'' /
list-of-modules-to-locate