comandos - perl manejo de archivos
¿Cómo incluyo funciones de otro archivo en mi script de Perl? (8)
Parece una pregunta muy simple, pero de alguna manera mi Google-Fu me falló.
¿Cuál es la sintaxis para incluir funciones de otros archivos en Perl? Estoy buscando algo como C''s #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.
Además, do ''file.pl'';
funcionará, pero los módulos son la mejor solución.
Lo que estás buscando es ''require file.pl'', pero lo que deberías mirar es ''use module''.
Perl require hará el trabajo. Deberá asegurarse de que cualquier archivo ''requerido'' devuelva la verdad al agregar
1;
al final del archivo.
Aquí hay 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 migre a módulos tan pronto como pueda .
EDITAR
Algunas ventajas de migrar código de scripts a módulos:
- Sin paquetes, todo ocupa un solo espacio de nombres, por lo que puede acceder a una situación donde dos funciones de archivos separados desean el mismo nombre.
- Un paquete le permite exponer algunas funciones, pero esconder otras. Sin paquetes, todas las funciones son visibles.
- Los archivos incluidos con
require
solo se cargan en tiempo de ejecución, mientras que los paquetes cargados con eluse
están sujetos a comprobaciones anteriores en tiempo de compilación.
Sé que la pregunta específicamente dice "funciones", pero obtengo esta publicación en lo alto cuando busco "incluir perl", y muchas veces (como ahora) quiero incluir variables (de una manera sencilla, sin tener que pensar) sobre módulos). Así que espero que esté bien publicar mi ejemplo aquí (ver también: Perl require and variables , en resumen: use require
, y asegúrese de que tanto los archivos "includer" como "includee" declaren 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
Sin embargo, debería buscar en los módulos perl, 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 puedes hacer #include y friends ....
Solo un truco rápido, ten cuidado ;-)
Todas las respuestas anteriores ignoraron la parte del cliente: cómo importar el módulo.
Consulte la respuesta aceptada aquí: ¿Cómo uso un módulo Perl desde una ubicación relativa?
Sin el truco en esta respuesta, tendrá muchos problemas para tratar de obtener la ruta del módulo correcta cuando use $mymodule;
Usa un módulo. Consulte perldoc perlmod y Exporter .
En el archivo Foo.pm
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 tu programa principal:
use strict;
use warnings;
use Foo; # import default list of items.
export_me( 1 );
O para obtener 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 del paquete, pero la práctica es desalentada.