2010-08-03 8 views
5

J'ai un script Perl (programme autonome) qui contient certains sous-marins que j'aimerais réutiliser dans d'autres scripts. En raison des limitations de l'environnement d'exécution, je ne peux pas déplacer les fonctions vers un fichier .pm commun.Script Perl utilisable en tant que programme et en tant que module

Est-il possible de faire la différence si le script a été exécuté en tant que programme autonome ou il était require ed/ed do par un autre script?

La seule chose que je pouvais trouver était d'utiliser caller au niveau supérieur: programme autonome n'a pas appel alors que quand require ed caller montre qui a fait charger le module. Y a-t-il une meilleure solution?

+0

J'ai posté la réponse ci-dessous, mais si vous pouviez élaborer sur les "limitations de l'environnement d'exécution", peut-il y avoir des façons de contourner ces limitations qui vous permettraient d'utiliser les modules appropriés? Thx – DVK

+0

@DVK: Je suis vraiment content de votre réponse. (Ni ma syntaxe de caller() check est aussi belle que dans votre réponse.) En ce qui concerne la limitation. Vraiment bête: je ne peux pas ajouter un autre module non exécutable au répertoire car il est analysé pour les fichiers et tous les noms de fichiers ont une signification particulière. L'ajout de .pm y casse d'autres scripts que je ne suis pas autorisé à modifier. – Dummy00001

+1

Selon @FM, ma question est essentiellement un dup de http://stackoverflow.com/questions/1131304/ – Dummy00001

Répondre

9

Oui, votre approche caller était correcte - c'est une technique nommée "modulinos" par brian d foy. Je devine que brian l'a inventé à moins que quelqu'un m'éclaire au contraire.

La principale partie de travail de modulino ressemble à ceci (de réponse SO lien ci-dessous):

__PACKAGE__->run(@ARGV) unless caller; 
sub run { 
    my($class, @args) = @_; 
} 
1; 

Voici quelques références:

"Modules as Programs" chapter from "Mastering Perl" book by brian d foy

"Scripts as Modules" article in Dr. Dobbs

"How a script becomes a module" article on perlmonks

What should I put in my starter template for my Perl programs?

+1

+1 Une question connexe: http://stackoverflow.com/questions/1215657. – FMc

+1

Tom Christiansen (je pense) a inventé le terme progmod pour ces nombreuses années avant "modulino" – ysth

+1

Je n'ai pas inventé la technique. Tom C. a été la première personne à le faire. Je viens de le populariser. –

Questions connexes