2017-06-05 4 views
0

Imaginez mon script a ces deux sous-marinsUtilisez module Perl uniquement lorsqu'il est nécessaire dans un sous-programme

sub with_json_mod{ 
    use JSON::Tiny; 
    blah blah blah; 
} 

sub without_json_mod{ 
    blah blah blah; 
} 

Je veux seulement utiliser « without_json_mod » quand JSON :: minuscule n'est pas installé.

Comment est-ce que je peux faire Perl pour échouer si JSON :: Tiny n'est pas installé et je veux utiliser le sub sansj_mod_mod à la place?

J'ai essayé d'appeler « exiger » dans le « with_json_mod » et il semble fonctionner, mais il ne fonctionne pas lorsque je tente de le faire importer le sous encode_json comme dans

sub with_json_mod{ 
    require JSON::Tiny qw/encode_json/; 
    blah blah blah; 
} 

Merci

+0

'eval "Module d'utilisation; 1"?' –

+0

Je pense que eval souffrirait car 'use' est une chose de compilation. – Sobrique

+0

Vrai oui, je pensais le tester avec 'eval' mais commenté rapidement, vous l'avez parfaitement résumé dans la réponse. @Sobrique –

Répondre

7

C'est parce que vous appelez require incorrectement.

Qu'est-ce que vous avez besoin est:

require JSON::Tiny; 
JSON::Tiny -> import ('encode_json'); 

Vous pouvez envelopper que dans un 'eval' aussi, et tester la valeur de [email protected]:

eval { require JSON::Tiny; }; 
warn [email protected] if [email protected]; 
6

Il existe deux différences principales entre use et require .

  1. use arrive au moment de la compilation et require se produit lors de l'exécution.
  2. use appelle la méthode import() dans le package chargé (le cas échéant) et require non.

Vous devez donc ajouter un appel à import().

sub with_json_mod{ 
    require JSON::Tiny; 
    JSON::Tiny->import('encode_json'); 
    blah blah blah; 
}