Question

J'ai le code Perl suivant qui s'appuie sur Term :: ReadKey pour obtenir la largeur du terminal; Ce module est manquant dans ma version NetBSD. Je souhaite donc que la largeur du terminal par défaut soit 80 lorsque le module est manquant.

Je n'arrive pas à comprendre comment utiliser un module de manière conditionnelle, sachant à l'avance s'il est disponible. Mon implémentation actuelle se ferme simplement avec un message disant qu'il ne trouve pas Term :: ReadKey s'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);

J'utilise Perl 5.8.7 sur NetBSD et 5.8.8 sur CygWin Pouvez-vous m'aider à intégrer cela plus efficacement dans mon script?

Était-ce utile?

La solution

Voici une solution simple qui ne nécessite aucun 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'elles se trouvent en dessous de celle-ci! :-) qui utilisent eval {use SomeModule} sont erronées car les instructions use sont évaluées au moment de la compilation, quel que soit leur emplacement dans le code. Donc, si SomeModule n'est pas disponible, le script mourra immédiatement lors de la compilation.

(Une chaîne eval d'une instruction use fonctionnera également ( eval 'use SomeModule'; ), mais cela n'a pas de sens d'analyser et de compiler un nouveau code à l'exécution La paire require / import fait la même chose et est vérifiée par la syntaxe lors de la compilation.)

Enfin, notez que mon utilisation de eval {...} et de $ @ ici est succincte aux fins de cet exemple. Dans le code réel, vous devez utiliser quelque chose comme Try :: Tiny ou au moins < a href = "http://search.cpan.org/dist/Try-Tiny/lib/Try/Tiny.pm#BACKGROUND" rel = "noreferrer"> soyez au courant des problèmes abordés .

Autres conseils

Découvrez le module CPAN Module :: Load :: Conditionnel . . Cela fera ce que vous voulez.

La réponse classique (remontant à Perl 4, du moins, bien avant qu’il y ait eu une "utilisation") était de "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.

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) {
    # ...
}
if  (eval {require Term::ReadKey;1;} ne 1) {
# if module can't load
} else {
Term::ReadKey->import();
}

ou

if  (eval {require Term::ReadKey;1;}) {
#module loaded
Term::ReadKey->import();
}

Remarque: 1; ne s’exécute que si requiert Term :: :: ... chargé correctement.

Je pense que cela ne fonctionne pas avec des variables. Veuillez vérifier ce lien , qui explique comment l'utiliser avec la variable

.
$class = 'Foo::Bar';
        require $class;       # $class is not a bareword
    #or
        require "Foo::Bar";   # not a bareword because of the ""

La fonction require recherchera le " Foo :: Bar " dans le tableau @INC et se plaindra de ne pas avoir trouvé "Foo :: Bar". Là. Dans ce cas, vous pouvez faire:

 eval "require $class";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top