Domanda Come posso trovare il file Perl caricato quando utilizzo un modulo?


in Perl, quando lo faccio use <module name> <ver>;, il sistema trova il .pm file per la libreria da qualche parte nel @INC sentiero.

Esiste un modo affidabile per quale file è stato effettivamente caricato?


44
2017-12-04 17:42


origine


risposte:


Sì, %INC contiene il percorso completo dal quale è stato caricato un modulo.

Esempio:

$ 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",
}

68
2017-12-04 18:11



Se il modulo ha la documentazione del pod e se è possibile garantire che l'utilità perldoc nel PATH appartenga allo stesso perl che sta eseguendo lo script, allora questo comando ti darà spesso il vero file trovato:

perldoc -l ModuleName

7
2017-12-05 15:15



perl -M'LWP '-e' usa Data :: Dumper; stampa Dumper \% INC '| grep LWP

Questo elencherà la posizione del modulo LWP sul disco ed elenca anche i moduli caricati all'interno di 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',

6
2017-12-29 19:56



Vuoi guardare nel %INC variabile, che registra il nome file caricato per le librerie caricate do, require, o use. Vedere perlvar per i dettagli.


5
2017-12-04 21:03



Ci sono un buon numero di moduli in CPAN per trovare queste informazioni, i candidati più probabili sembrano essere Module :: Find, Module :: Which e Module :: Locate. Probabilmente andrò 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";

Nel contesto dell'elenco locate restituisce tutte le copie trovate di Some :: Module in ordine in base a @INC.

Modificare: derobert suggerisce un modo molto migliore, Non mi ero reso conto che% INC ne avesse già avuto ... Questa soluzione basata su moduli sarebbe ancora utile se volessi sapere prima di caricare il modulo da cui sarebbe stato caricato.


4
2017-12-04 18:10



Ecco un one-liner (con un wrapper bash) per determinare se un modulo è installato - e dove verrà caricato da:

#!/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"

Chiamalo con la sintassi del nome del modulo di perl:

./find_perl_module  Font::Metrics::Courier

4
2018-06-09 17:02



Da quello che ho trovato, perl cercherà nelle directory all'interno del percorso:

perl -le 'print foreach @INC'

Quindi verrà visualizzato nella libreria standard e quindi nella directory corrente.

Questo ti dà un ordine di ricerca.

La mia fonte:

Estendere il percorso della libreria


1
2017-12-04 17:53