Come posso verificare se un modulo Perl è installato sul mio sistema dalla riga di comando?

StackOverflow https://stackoverflow.com/questions/1039107

  •  22-07-2019
  •  | 
  •  

Domanda

Ho provato a verificare se XML :: Simple è installato nel mio sistema o meno.

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

Il precedente one-liner è stato usato per elencare tutti i moduli installati nel mio sistema. Tuttavia, non elenca i moduli XML.

Tuttavia, quanto segue viene eseguito correttamente.

perl -e "use XML::Simple "

Quale potrebbe essere il problema?

È stato utile?

Soluzione

È possibile verificare il percorso di installazione di un modulo tramite:

perldoc -l XML::Simple

Il problema con il tuo one-liner è che non attraversa ricorsivamente directory / sottodirectory. Quindi, ottieni solo nomi di moduli pragmatici come output.

Altri suggerimenti

Veloce e sporco:

$ perl -MXML::Simple -e 1
$ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

Dalla perlvar su %INC :

  
      
  • % INC
  •   
     

L'hash do contiene voci per ciascun nome file incluso tramite gli operatori require, use o <=>. La chiave è il nome file specificato (con i nomi dei moduli convertiti in nomi percorsi) e il valore è la posizione del file trovato. L'operatore <=> utilizza questo hash per determinare se un determinato file è già stato incluso.

     

Se il file è stato caricato tramite un hook (ad esempio un riferimento alla subroutine, vedere richiedi per una descrizione di questi hook), questo hook è di default inserito in <=> al posto di un nome file. Si noti, tuttavia, che l'hook potrebbe aver impostato la voce% INC da solo per fornire alcune informazioni più specifiche.

Ad esempio, per verificare se il modulo DBI è installato o meno, utilizzare

perl -e 'use DBI;'

Vedrai un errore se non installato. (da http://www.linuxask.com )

Quello che stai facendo non è ricorrere in directory. Elenca solo i moduli nella directory principale della @INC directory.

Il modulo XML::Simple vivrà in uno dei XML/Simple.pm percorsi in CPAN.

Quello che ha detto sopra per trovare moduli specifici.

<=> spiega come trovare tutti i moduli qui, vedi Come trovare moduli installati .

Se vuoi verificare rapidamente se un modulo è installato (almeno sui sistemi Unix, con Bash come shell), aggiungi questo al tuo file .bashrc:

alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"

Quindi puoi:

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607
  

while (< @INC >)

Questo unisce i percorsi in @INC in una stringa, separati da spazi, quindi chiama glob () sulla stringa, che quindi scorre attraverso i componenti separati da spazio (a meno che non ci siano meta-caratteri che alterano i file.)

Questo non funziona così bene se in @INC sono presenti percorsi contenenti spazi, \, [], {}, *,? o ~, e non sembra esserci alcun motivo per evitare l'alternativa sicura:

for (@INC)

Se stai eseguendo ActivePerl su Windows:

  • C:\>ppm query * per ottenere un elenco di tutti i moduli installati

  • C:\>ppm query XML-Simple per verificare se XML::Simple è installato

Credo che la tua soluzione cercherà solo nella radice di ogni percorso di directory contenuto nell'array @INC. Hai bisogno di qualcosa di ricorsivo, come:

 perl -e 'foreach (@INC) {
    print `find $_ -type f -name "*.pm"`;
 }'

Bravo per la soluzione di @ user80168 (sto ancora contando \ di!) ma per evitare tutte le fughe coinvolte con alias e shell:

%~/ cat ~/bin/perlmod
perl -le'eval qq{require $ARGV[0]; } 
    ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) 
    : print "Not installed" ' $1

funziona abbastanza bene.

Qui potrebbe essere il più semplice e il più " moderno " approccio, utilizzando Module::Runtime :

perl -MModule::Runtime=use_module -E '
     say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI

Questo darà un utile errore se il modulo non è installato.

L'utilizzo di -MModule::Runtime richiede l'installazione (non è un modulo principale).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top