2010-08-03 9 views
5

Tengo un script Perl (programa independiente) que contiene algunos subs que me gustaría reutilizar en otros scripts. Debido a las limitaciones del entorno de ejecución, no puedo mover las funciones a un archivo común .pm.Script Perl utilizable como programa y como módulo

¿Es posible diferenciar si el script se ejecutó como un programa independiente o fue require ed/do ed por otro script?

Lo único que pude encontrar fue utilizar caller en el nivel superior: programa independiente no tiene ninguna persona que llama mientras que cuando require ed caller espectáculos que hicieron cargar el módulo. ¿Hay alguna solución mejor?

+0

He publicado la respuesta a continuación, pero si pudiera profundizar sobre las "limitaciones del entorno de ejecución", ¿puede haber alguna forma de superar esas limitaciones que le permitirían utilizar los módulos adecuados? Thx – DVK

+0

@DVK: estoy muy contento con tu respuesta. (Ni mi sintaxis de llamada() es tan buena como en tu respuesta.) En cuanto a la limitación. Realmente bastante tonto: no puedo agregar otro módulo no ejecutable al directorio, ya que se escanea en busca de los archivos y todos los nombres de los archivos tienen un significado especial. Agregar .pm allí rompe otros scripts que no puedo modificar. – Dummy00001

+1

Según @FM, mi pregunta es básicamente un duplicado de http://stackoverflow.com/questions/1131304/ – Dummy00001

Respuesta

9

Sí, su enfoque caller era correcto: esta es una técnica llamada "modulinos" por brian d foy. Supongo que Brian lo inventó a menos que alguien me aclare lo contrario.

La parte principal de trabajo de modulino se parece a esto (de Así que la respuesta vinculada a continuación):

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

Aquí hay un par de referencias:

"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 Una pregunta relacionada: http://stackoverflow.com/questions/1215657. – FMc

+1

Tom Christiansen (creo) acuñó el término progmod durante muchos años antes de "modulino" – ysth

+1

No inventé la técnica. Tom C. fue la primera persona que vi hacerlo. Lo acabo de popularizar. –

Cuestiones relacionadas