2009-11-10 8 views
59

Esto parece una pregunta muy simple pero de alguna manera mi Google-Fu me falló.¿Cómo incluyo funciones de otro archivo en mi script de Perl?

¿Cuál es la sintaxis para incluir funciones de otros archivos en Perl? Estoy buscando algo como C #include "blah.h"

Vi la opción de usar módulos Perl, pero parece que requerirá una reescritura no insignificante de mi código actual.

+8

grado o por fuerza de guiones en uno al otro está pidiendo dolor. La diferencia entre un módulo y un script de código es muy leve, pero la encapsulación es mucho mejor. ¿Qué cosas específicas te hacen pensar que se requerirá una reescritura mayor para usar módulos? – daotoad

+3

Las guías que estaba viendo en línea hicieron que crear y agregar módulos pareciera una tarea mucho más complicada de lo que realmente era. Gracias por mostrarme su simplicidad –

Respuesta

60

Utilice un módulo. Consulte perldoc perlmod y Exporter.

En Foo.pm archivo

package Foo; 
use strict; 
use warnings; 
use Exporter; 

our @ISA= qw(Exporter); 

# these CAN be exported. 
our @EXPORT_OK = qw(export_me export_me_too); 

# these are exported by default. 
our @EXPORT = qw(export_me); 

sub export_me { 
    # stuff 
} 

sub export_me_too { 
    # stuff 
} 

1; 

En el programa principal:

use strict; 
use warnings; 

use Foo; # import default list of items. 

export_me(1); 

O para conseguir ambas funciones:

use strict; 
use warnings; 

use Foo qw(export_me export_me_too); # import listed items 

export_me(1); 
export_me_too(1); 

También puede importar variables de paquete, pero el la práctica es fuertemente desaconsejada.

+3

Echa un vistazo a Sub :: Exporter ¡es todo el delirio! http://search.cpan.org/~rjbs/Sub-Exporter-0.982/lib/Sub/Exporter.pm –

+3

Además, si no está instalando el módulo en una de las ubicaciones predeterminadas para módulos perl, simplemente agregue esto antes del "uso Foo"; línea: use lib ('C:/Module/Location'); –

+0

Digamos que tengo libs desde la ubicación predeterminada y quiero usar un módulo que se encuentra en el directorio local porque realmente solo lo usa la aplicación actual y el módulo se creó para organizar mejor el script. ¿El uso de la línea lib le indicará a perl que solo observe la ubicación que especifico para todo el módulo o lo agrega a la ruta de acceso de la lib que perl busca? – joejoeson

7

Creo que está buscando require o use palabras clave.

3

Realmente debería considerar los módulos perl, sin embargo, para un hack rápido siempre podría ejecutar "perl -P", que ejecuta su script perl a través del preprocesador C. Eso significa que usted puede hacer amigos y # include ....

Sólo un corte rápido, sin embargo, tenga cuidado ;-)

41

Perl require hará el trabajo. Usted tendrá que asegurarse de que cualquier 'archivos require'd vuelven verdad mediante la adición de

1; 

al final del archivo.

He aquí una pequeña muestra:

$ cat m1.pl 
use strict; 
sub x { warn "aard"; } 
1; 

$ cat m2.pl 
use strict; 
require "m1.pl"; 
x(); 

$ perl m2.pl 
aard at m1.pl line 2. 

Pero migran a los módulos tan pronto como sea posible.

EDITAR

algunos de los beneficios de la migración de código de secuencias de comandos para módulos:

  • Sin paquetes, todo lo que ocupa un espacio de nombres, por lo que puede golpear una situación en la que dos funciones de archivos separados quieren el mismo nombre.
  • Un paquete le permite exponer algunas funciones, pero ocultar otras. Sin paquetes, todas las funciones son visibles.
  • Los archivos incluidos con require solo se cargan en el tiempo de ejecución, mientras que los paquetes cargados con use están sujetos a comprobaciones anteriores en tiempo de compilación.
+0

Esta es más directamente comparable con C#include de lo que puedo decir, y es exactamente lo que necesitaba. – Herms

+0

'Un paquete le permite exponer algunas funciones, pero esconder otras. Sin paquetes, todas las funciones son visibles. ¿Cómo hacemos esto? – N3Xg3N

3

Lo que está buscando es 'require file.pl', pero lo que debería estar mirando es 'use module'.

5

También, do 'file.pl'; funcionará, pero los módulos son la mejor solución.

4

Sé que la pregunta dice "funciones" específicamente, pero obtengo esta publicación en la parte superior cuando busco "incluir perl", y muchas veces (como ahora) quiero incluir variables (de una manera sencilla, sin tener que pensar en módulos). Y así que espero que está bien publicar mi ejemplo aquí (véase también: Perl require and variables; en pocas palabras: usar require, y asegurarse de que tanto y archivos "Includer" "includee" declarar la variable como our):

$ perl --version 

This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ... 

$ cat inc.pl 
use warnings; 
use strict; 

our $xxx = "Testing"; 

1; 

$ cat testA.pl 
use warnings; 
use strict; 

require "inc.pl"; 
our $xxx; 

print "1-$xxx-\n"; 
print "Done\n"; 

$ perl testA.pl 
1-Testing- 
Done 


$ cat testB.pl 
use warnings; 
use strict; 

our $xxx; 
print "1-$xxx-\n"; 

$xxx="Z"; 
print "2-$xxx-\n"; 

require "inc.pl"; 

print "3-$xxx-\n"; 
print "Done\n"; 

$ perl testB.pl 
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5. 
1-- 
2-Z- 
3-Testing- 
Done 
2

El todas las respuestas anteriores ignoraron la parte del cliente: cómo importar el módulo.

Ver la respuesta aceptada aquí: How do I use a Perl module from a relative location?

Sin el truco en esta respuesta, usted tendrá un montón de problemas tratando de obtener la ruta del módulo derecha cuando inclusión use $mymodule;

Cuestiones relacionadas