Joaquin escribiste:No es necesario hacer un módulo para dividir un programa en partes.
El método más sencillo para incorporar funciones definidas en otros archivos perl es importarlas con el operador do o con el require.
Por ejemplo, tenemos este código con una función definida:
En realidad un módulo sigue siendo cualquier componente reutilizable extra ( puede ser interno o externo) del cual puedes importar símbolos, ignorando si es con
require o
use.
Joaquin escribiste:Sólo tiene una función, que necesita un parámetro. Luego, tenemos un programa que necesita esa función:
- Código: Seleccionar todo
#!/usr/bin/perl
require 'funciones.pl';
my $nombre = "Leibvitz";
&pinta($nombre);
Se podía haber usado 'do' en vez de 'require', pero este último hace un chequeo de errores, provoca una excepción si no encuentra el fichero, no es capaz de compilar el código perl o si después de hacerlo algún código de inicialización devuelve un valor que no sea positivo (por eso el fichero acaba en un 1; )
El uso de &func(
params ) creo que ya lo había comentado anteriormente en el foro, ha sido descalificado desde Perl 5.003, por qué? No permite el uso de prototipos, hace mas oscuro el código, y el uso de &func hace uso de la misma @_. Sin embargo goto &func o \&func es otro rollo. &func también puede servirte sólo cuando lo usas en conjunto con
defined.
No es buen estilo. Déjalo para Perl4.
Joaquin escribiste:De todas formas, hacer un módulo es fácil:
Módulo Funciones.pm:
- Código: Seleccionar todo
package Funciones;
sub pinta
{
my $nombre = shift;
print "Hola $nombre\n";
}
1;
Programa:
- Código: Seleccionar todo
#!/usr/bin/perl
use Funciones;
Funciones::pinta("Leibvitz");
O importando los nombres de las funciones dentro de tu programa:
Módulo Funciones.pm:
- Código: Seleccionar todo
package Funciones;
use Exporter;
@ISA = ('Exporter');
@EXPORT = qw( &pinta );
sub pinta
{
my $nombre = shift;
print "Hola $nombre\n";
}
1;
Programa:
- Código: Seleccionar todo
#!/usr/bin/perl
use Funciones;
pinta("Leibvitz");
Bueno tomando en cuenta que ya te mencioné lo malo de usar '&func', el ejemplo es bueno, sin embargo, creo se te olvidó explicar ( a menos que no haya sido tu intención inicial ) qué es lo que
use hace internamente.
use simplemente ofrece lo siguiente:
- Los módulos son verificados en tiempo de compilación, a diferencia de require/do, que son en tiempo de ejecución, por lo tanto la falta de módulos y algunos otros fallos en compile-time, pueden ser atrapados directamente con use.
- En conjunto con eval puede permitirte el name mapping y otras técnicas en tiempo de ejecución.
- Lo que use realiza detrás de las cámaras es:
- Código: Seleccionar todo
use Mi::Modulo;
es tratado como:
- Código: Seleccionar todo
BEGIN {
require Mi::Modulo;
import Mi::Modulo;
}
Es decir, hace la carga del módulo, e importará al espacio de nombres actual los símbolos que dicho módulo importe por default según indicado en Exporter.
Sin embargo, cuando usamos:
- Código: Seleccionar todo
use Mi::Modulo qw( foo bar baz);
lo que normalmente quiere decir Perl es:
- Código: Seleccionar todo
BEGIN {
require Mi::Modulo;
import Mi::Modulo qw( foo bar baz );
}
es decir, importa los símbolos foo bar y baz a nuestro espacio de nombres.
y el uso de:
- Código: Seleccionar todo
use Mi::Modulo ();
es convertido a:
- Código: Seleccionar todo
BEGIN { require Mi::Modulo; }
Como podrán observar, el comportamiento al usar
use es mucho mas seguro que require/do.
El trabajo de Exporter lo dejaremos para luego que hablemos de la tabla de símbolos y los typeglobs.
Saludos,
NOTA: mas referencias en
perlmod y
perlmodlib.