55 votes

Comment puis-je vérifier si j'ai un module Perl avant de l'utiliser?

J'ai le texte suivant du code Perl qui s'appuie sur Term::ReadKey pour obtenir le terminal de largeur; Mon NetBSD construire est manquant ce module, je tiens donc à défaut de la largeur du terminal à 80 lorsque le module est manquant.

Je ne peux pas comprendre comment conditionnelle, l'utilisation d'un module, en sachant à l'avance si elle est disponible. Mon actuel de mise en œuvre de juste se ferme avec un message disant qu'il ne peut pas trouver Term::ReadKey si il est absent.

#/usr/pkg/bin/perl -w
# Try loading Term::ReadKey
use Term::ReadKey;
my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
my @p=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
my $plen=$#p+1;
printf("num |".("%".int(($wchar-5)/$plen)."d") x $plen."\n",@p);

Je suis à l'aide de Perl 5.8.7 sur NetBSD et 5.8.8 sur CygWin Pouvez-vous m'aider à mettre en œuvre ce dans mon script de manière plus efficace?

97voto

John Siracusa Points 8106

Voici un bare-bones solution qui ne nécessite pas un autre module:

my $rc = eval
{
  require Term::ReadKey;
  Term::ReadKey->import();
  1;
};

if($rc)
{
  # Term::ReadKey loaded and imported successfully
  ...
}

Notez que toutes les réponses ci-dessous (j'espère qu'ils sont au-dessous de celui-ci! :-) qui utilisent eval { use SomeModule } sont mauvais, parce que, use des déclarations sont évalués au moment de la compilation, peu importe où dans le code qu'ils apparaissent. Donc, si SomeModule n'est pas disponible, le script va mourir immédiatement lors de la compilation.

(Une chaîne eval d'un use déclaration de travaux (eval 'use SomeModule';), mais il n'y a pas de sens de l'analyse et la compilation nouveau code au moment de l'exécution lorsque l' require/import paire fait la même chose, et c'est de la syntaxe vérifié au moment de la compilation de démarrage.)

Enfin, notez que mon utilisation de l' eval { ... } et $@ ici est succinct pour l'objet de cet exemple. Dans le code réel, vous devez utiliser quelque chose comme Essayer::Minuscule, ou au moins être au courant des problèmes qu'il aborde.

11voto

m0j0 Points 949

Découvrez le module CPAN Module :: Load :: Conditionnel . Ça fera ce que tu veux.

7voto

Jonathan Leffler Points 299946

La réponse classique (remontant à Perl 4, du moins, bien avant qu’il y ait eu une «utilisation») consistait à «require ()» un module. Ceci est exécuté lorsque le script est exécuté, plutôt que lors de la compilation, et vous pouvez tester le succès ou l'échec et réagir de manière appropriée.

4voto

Hinrik Points 557

Et si vous avez besoin d’une version spécifique du module:

 my $GOT_READKEY;
BEGIN {
    eval {
        require Term::ReadKey;
        Term::ReadKey->import();
        $GOT_READKEY = 1 if $Term::ReadKey::VERSION >= 2.30;
    };
}


# elsewhere in the code
if ($GOT_READKEY) {
    # ...
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X