modules metacpan mcpan manager library cpanminus perl module

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:

Extendiendo el camino de la biblioteca



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