2009-07-07 5 views

Respuesta

16

TIMTOWTDI:

eval "use Module; 1" or die "you need Module to run this program". 

o

require Module or die "you need Module to run this program"; 
Module->import; 

o

use Module::Load; 

eval { load Module; 1 } or die "you need Module to run this program"; 

puede encontrar en Module::LoadCPAN.

+0

el uso de su última declaración de código debería comenzar con una u minúscula, ¿verdad? – Geo

+0

Sí, lo arreglé y agregué un enlace Módulo :: Entrada de CPAN de Load –

+3

Requerir errores fatales, por lo que debe estar incluido en una evaluación. Además, para ser idéntico a "usar", cualquier código de requerir/importar debe estar en un bloque BEGIN. Entonces: BEGIN {eval {requiere 'Módulo' o muere "Ugh."; Módulo-> importar; 1} o haz {morir "Te falta módulo"}} – daotoad

11

Puede utilizar Module::Load::Conditional

use Module::Load::Conditional qw[can_load check_install requires]; 


my $use_list = { 
    CPANPLUS  => 0.05, 
    LWP   => 5.60, 
    'Test::More' => undef, 
}; 

if(can_load(modules => $use_list)) 
{ 
    print 'all modules loaded successfully'; 
} 
else 
{ 
    print 'failed to load required modules'; 
} 
+0

ten cuidado: esto agrega una dependencia en las distribuciones de Linux basadas en rpm (por ejemplo, RHEL, Fedora) porque envían Module :: Load :: Conditional en un paquete separado. Solo digo :-). – Michael

+0

Se incluyó por defecto en openSUSE 12.3 (también basado en rpm) – altmas5

0
 
use strict; 
use warnings; 
use Module; 

Si no tiene instalado el módulo, obtendrá el error "No se puede encontrar en Module.pm @INC (@INC contiene: .. .). " lo cual es comprensible

¿Hay alguna razón en particular por la que desee/necesite un mensaje más específico?

+2

Es útil para evitar que la aplicación/secuencia de comandos muera cuando el módulo se utiliza para alguna función opcional. –

+1

El mensaje de error es comprensible para nosotros, pero no para los usuarios "normales". Y es lo suficientemente detallado que muchos usuarios probablemente ni siquiera intenten leerlo en absoluto. Incluso si lo hacen, el mensaje de error por supuesto no les enseña cómo instalar módulos. Como alguien que ha enviado algunas secuencias de comandos Perl a varias personas, definitivamente puedo entender por qué Pedro pregunta. – mivk

1

Algo como esto, use Net::SMTP si tiene el módulo instalado, o una cursi sendmail llamada como último recurso.

my $mailmethod = eval "use Net::SMTP; 1" ? 'perl' : 'sendmail'; 
0

Así es como voy al respecto:

sub do_optional_thing { 
    init_special_support(); 
    Module::Special::wow(); 
} 

sub init_special_support { 
    # check whether module is already loaded 
    return if defined $INC{'Module/Special'}; 

    eval { 
     require Module::Special; 
     Module::Special->import(); 
    }; 

    croak "Special feature not supported: Module::Special not available" if [email protected]; 
} 
2

Hay muchos módulos para hacer eso; vea la lista de CPAN modules that (can) load other modules. Sin embargo, es un poco arriesgado confiar en un módulo externo (¿y si no está presente?). Bueno, por lo menos, si se basan en Moose, Class::Load se puede utilizar de forma segura, ya que es requisito previo de Moose:

#!/usr/bin/env perl 
use strict; 
use utf8; 
use warnings qw(all); 

use Class::Load qw(try_load_class); 

try_load_class('Module') 
    or die "You need module Module to run this program."; 
Cuestiones relacionadas