7
votes

Perl: Les symboles d'exportation du module contenant> 1 paquet

module foo / bar.pm xxx

un consommateur qui fait xxx

ne reçoit pas le foo :: wizzy :: x exporter

Je sais que je peux en faire deux modules distincts, mais je devrais toujours pouvoir faire ce travail, n'est-ce pas?


2 commentaires

thx to tout - le consensus semble - utiliser 2 fichiers que je faisais juste paresseux et je promets de dire foo pas foo


Dans ce cas, je vais vous uppoter! :)


4 Réponses :


7
votes

Lorsque vous appelez Utiliser foo :: bar , ce qui se passe effectivement est essentiellement: xxx

(voir perdoc -f utilise )

donc Import n'est jamais appelé sur foo :: Wizzy . Si vous souhaitez importer ces symboles aussi, vous pouvez appeler commencer {foo :: wizzy-> importer} vous (après Utiliser foo :: bar ). Ou, comme vous l'avez dit, il suffit de scinder ces deux paquets en fichiers séparés, ce qui serait beaucoup plus lisible par l'homme.

(Au fait, il n'est pas conseillé d'utiliser des noms de paquets à baisses inférieurs, comme ceux-ci sont généralement réservé aux pragmates perl.)


2 commentaires

L'OP pourrait également écrire une méthode personnalisée Import pour FOO :: Barre qui exporte les trucs de FOO :: Wizzy. (Pas que je le ferais de cette façon.)


@Michael: Ouais, je ne fais que mettre des paquets ensemble pour le code arrière de la serviette, donc à ce stade, j'irais "F-- it, je ne sauve aucun temps d'avoir ces deux paquets dans un seul fichier" et diviser les.



7
votes

Vous pouvez le faire en utilisant Exporter's < Code> export_to_level méthode pour que le "paquet principal" à réexporter les symboles "Autres" de l'emballage, comme: xxx

si Certains :: Autre :: Module fait quelque chose de plus compliqué que "l'exportation tout" que vous aurez probablement besoin de manipulation de Fanier pour @_ .

Je dois vraiment demander pourquoi , bien que je ne peux pas imaginer une utilisation pour cela qui est compatible avec les mots "bon code" :)


2 commentaires

+1 J'ai oublié export_to_level et presque recréé la fonctionnalité ;-)


Oui, je commence toujours à avoir un peu de défensive quand je vois quelqu'un d'autre qui joue avec ma table de symboles. C'est comme une invasion de l'espace personnel: tu ferais mieux d'être en cas d'urgence ou marié à moi :)



2
votes

Tout d'abord, je trouve utile d'utiliser des accolades enfermées pour contrôler la portée lors de la collecte de plusieurs packages dans un seul fichier. En outre, enfermer le package dans un bloc de début, il fonctionne plus comme un approprié utilisé a été utilisé pour le charger, mais c'est surtout si je suis en train de plonger dans le script principal.

Utiliser FOO est identique à celui commencer {besoin foo; Foo-> importer} .

Donc, vous avez deux choix:

  • appeler commencer {foo :: whizzy-> importer; } dans votre script principal.
  • faire foo :: bar :: importer déclencheur foo :: whizzy :: importer sur le module d'appel.

    dans foo / bar.pm: xxx

    dans votre code principal: xxx


0 commentaires

3
votes

à la fin du module, placez: xxx

puis le code peut simplement dire: xxx

pour obtenir foo :: Wizzy's Exportations.


0 commentaires