2010-08-30 4 views
0

EDIT Désolé pour la confusion, voici ma question mise à jour.importer un sous-programme de bibliothèque en utilisant FindBin en perl

J'utilise FindBin dans mon script perl comme ceci:

use FindBin qw($Bin); 
use lib "$Bin/../lib"; 
use multi_lib qw(say_hello_world); 

Cela fonctionne:

multi_lib::say_hello_world(); 

mais cela ne fait pas:

say_hello_world(); 

EDIT 2

Voici comment multi_lib.pm ressemble:

package multi_lib; 

use strict; 
use warnings; 
use 5.010; 

require Exporter; 
my @ISA = qw(Exporter); # removing `my` causes an error! 
my @EXPORT_OK = qw(say_hello_world); # removing `my` causes an error! 

sub say_hello_world { 
say "hello world!"; 
} 

P.S. Je n'ai aucune idée de ce que signifie @ISA et si l'ajout du my est OK ... J'ai suivi le preldoc pour Exporter.

Edit 3 Je pense que je l'ai résolu en déplaçant @EXPORT_OK avant use strict. Je suis habitué à mettre use strict au début de mes scripts mais je suppose que ce n'est pas la façon d'y aller (?). Quoi qu'il en soit, cela fonctionne:

use Exporter 'import'; 
@EXPORT_OK = qw(say_hello_world); 
use strict; 
... 

Je voudrais encore apprécier quelques explications quant à ce qui se passe ici exactement et quelle est la méthode recommandée pour l'exportation des sous-routines (comme je l'ai fait?).

+0

est-ce que say_hello_world est exporté de multi_lib? – DVK

+0

oui, je le pense. voir éditer 2. –

Répondre

4

Vous ne pouvez pas faire cela. La routine import() de lib modifie @INC au lieu d'essayer d'exporter quoi que ce soit. Mais dans tous les cas, lib.pm ne contient aucune fonction adaptée à un usage externe. Qu'est-ce que vous essayez vraiment d'accomplir?

réponse Mise à jour pour la question mise à jour:

Non, vous ne pouvez pas utiliser mon() sur @EXPORT_OK; il doit être globalement visible afin que l'exportateur puisse l'utiliser. Dites our @EXPORT_OK; à la place.La même chose est vraie pour @ISA; la variable de package @ISA contrôle l'héritage, un @ISA lexical ne fait rien. Je préfère ne pas hériter de l'exportateur, cependant; vous faites cela (sauf très ancien exportateur) juste en importer la routine d'importation de l'exportateur:

use Exporter 5.57 'import'; 

L'erreur que vous avez que vous êtes invité à ajouter mon() est parce que vous avez spécifié use strict; (qui, entre autres, exige que les variables soient correctement déclarées sauf s'il s'agit de variables de paquetage qualifiées par le nom du paquet ou par des variables globales spéciales). our() est l'équivalent de my() qui déclare des variables en tant que variables de package au lieu de lexicales, elles sont donc accessibles depuis l'extérieur de la portée dans laquelle elles sont déclarées. Il est préférable de les déclarer correctement avec notre() que de simplement les déplacer au-dessus de use strict; pour contourner l'erreur.

+0

désolé, s'il vous plaît voir le message édité –

+0

@David B: mis à jour ma réponse – ysth

+0

Vous devriez dire 'use Exporter 5.57 'importer';' parce que les versions précédentes de l'exportateur ne supportait pas ce style d'utilisation. De cette façon, quelqu'un qui exécute votre code sur un ancien Perl obtiendra un message d'erreur correct (et exportateur est extensible). – cjm

0

Ce n'est pas ainsi que fonctionnent les bibliothèques. Vous devez définir l'emplacement de votre bibliothèque puis charger un module (.pm) contenant la sous-routine souhaitée.

+0

désolé, s'il vous plaît voir édité post –

0

Je voudrais IMPRT un sous-programme spécifique (alias say_hello_world) de lib, mais cela ne fonctionne pas:

use lib "$Bin/../lib" qw(say_hello_world); 

Le use lib juste des points que vous dans le répertoire où les fichiers sont , vous devez également spécifier le fichier. Si votre sous-programme est dans un fichier Example.pm alors vous avez besoin

use Example qw(say_hello_world); 

Notez également que la partie FindBin doit être à l'intérieur d'un bloc BEGIN:

BEGIN { 
    use FindBin qw($Bin); 
    use lib "$Bin/../lib"; 
}; 
use Example qw(say_hello_world); 
+0

désolé, s'il vous plaît voir édité post –

+0

aussi, pourquoi est le bloc BEGIN nécessaire ici? –

Questions connexes