2009-07-07 5 views

Répondre

16

TIMTOWTDI:

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

ou

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

ou

use Module::Load; 

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

Vous pouvez trouver Module::Load sur CPAN.

+0

l'utilisation de votre dernier code devrait commencer par une minuscule, n'est-ce pas? – Geo

+0

Ouais, je l'ai corrigé et j'ai ajouté un lien. L'entrée CPAN du module :: Load –

+3

Exige est fatal sur les erreurs, donc il doit être enveloppé dans un eval. De plus, pour être identique à 'use', tout code require/import doit être dans un bloc BEGIN. Donc: BEGIN {eval {require 'Module' ou die "Ugh."; Module-> importer; 1} ou do {die "Vous n'avez pas de module"}} – daotoad

11

Vous pouvez utiliser 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

Attention: ceci ajoute une dépendance aux distributions Linux basées sur RPM (par exemple RHEL, Fedora) car elles transportent Module :: Load :: Conditionnel dans un paquet séparé. Je dis juste :-). – Michael

+0

Il était inclus par défaut dans openSUSE 12.3 (également basé sur rpm) – altmas5

0
 
use strict; 
use warnings; 
use Module; 

Si vous ne disposez pas du module installé, vous obtiendrez l'erreur « Impossible de localiser Module.pm dans @INC (@INC contient: .. .). " ce qui est assez compréhensible.

Y a-t-il une raison particulière pour laquelle vous voulez/avez besoin d'un message plus spécifique?

+2

Il est utile d'éviter que l'app/script ne meure lorsque le module est utilisé pour une fonction optionnelle. –

+1

Le message d'erreur est compréhensible pour nous, mais pas pour les utilisateurs "normaux". Et il est assez bavard que beaucoup d'utilisateurs n'essaieront probablement même pas de le lire du tout. Même si c'est le cas, le message d'erreur ne leur enseigne pas comment installer les modules. Comme quelqu'un qui a envoyé quelques scripts Perl à plusieurs personnes, je peux définitivement comprendre pourquoi Pedro demande. – mivk

1

Quelque chose comme ceci, use Net::SMTP si vous avez installé le module, ou une légende sendmail en dernier recours.

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

Voici comment je vais parler:

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

Il existe de nombreux modules pour le faire; voir la liste des CPAN modules that (can) load other modules. Cependant, il est un peu risqué de s'appuyer sur un module externe (que se passe-t-il s'il n'est pas présent?). Eh bien, au moins, si vous comptez sur Moose, Class::Load peut être utilisé en toute sécurité car il est la condition sine qua non 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."; 
Questions connexes