Foros del Web » Programación para mayores de 30 ;) » Programación General »

hacer librerías en perl

Estas en el tema de hacer librerías en perl en el foro de Programación General en Foros del Web. hola, les pido por favor si me pueden responder el mensaje anterior que mande que hasta ahora nadie contestó y este mensaje: Como se puede ...
  #1 (permalink)  
Antiguo 24/07/2003, 12:34
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
hacer librerías en perl

hola, les pido por favor si me pueden responder el mensaje anterior que mande que hasta ahora nadie contestó y este mensaje:

Como se puede hacer una librería en perl de modo que en mis scripts colocar el nombre de la subrutina o función y que me tire el resultado (las funciones que estén en otro archivo o librería)


Gracias
MonoSwim
  #2 (permalink)  
Antiguo 26/07/2003, 09:30
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola mi amigo,

Hay varias maneras de proceder en Perl cuando se desea hacer uso de funciones que hacen parte de un archivo externo.

En el mundo de Perl, aquellos archivos de código que contienen funciones útiles que uno quisiera importar desde sus propios programas se conocen como `módulos', y Perl provee básicamente dos funciones estándar para la importación de módulos: `use' y `require'.

`require' por una parte, provee un mecanismo simple de importar declaraciones, símbolos y demás desde un archivo externo. Esta función incluso puede ser usada para indicar que el programa actual requiere una versión específica del intérprete Perl (puedes leer más al respecto en la documentación de Perl).

Estudiemos un ejemplo. Supongamos que tienes una cantidad determinada de funciones simples que quieres importar desde algún programa dado, y llamarlas desde el archivo principal del programa. Para nuestro caso, imaginemos que contamos con un archivo llamado `funciones.pl' con el siguiente contenido:

Código:
sub funcion1 ()
{
        print "Esta es la funcion 1\n";
}
 
sub funcion2 ()
{
        print "Esta es la funcion 2\n";
}
 
1;  # Retornar un valor de `verdad'
Hasta aquí todo luce razonable. Quizás lo único un poco extraño es esa última línea que contiene tan solo una expresión `1;'. Esta línea resulta necesaria ya que cuando un archivo (módulo) va a ser importado desde otra parte, éste archivo debe retornar un valor `verdadero' (en términos de lógica del lenguaje). Por esto suele colocarse una línea como ésta al final de los módulos de Perl.

Ahora bien, supongamos que escribimos un programa en Perl, y el archivo principal en donde hemos colocado todo el código se llama `programa.pl', por ejemplo. Este sería un modo de importar el módulo que hemos escrito y hacer uso de sus funciones desde `programa.pl':

Código:
#! /usr/bin/perl -w
use strict;
 
push (@INC, '.');
require 'funciones.pl';
 
funcion1 ();
funcion2 ();
Allí puedes ver a la función `require' siendo usada en la práctica. Otro detalle interesante sale a relucir en este fragmento de código: la línea en la que mediante la función push() se le agrega el elemento '.' al arreglo @INC.

Resulta que el arreglo @INC es una variable predefinida de Perl que contiene un conjunto de rutas en el sistema de archivos, que funciones como `require' y `use' utilizan para localizar los módulos que van a ser importados. Al agregarle el valor '.' (un punto sencillo), nos aseguramos de que el directorio actual sea parte de esas rutas en las que va a ser buscado nuestro módulo. (Puedes leer más sobre el arreglo @INC y otras variables predefinidas de Perl en la documentación).

De este modo, cuando colocas los archivos `funciones.pl' y `programa.pl' en el mismo directorio, y ejecutas el programa, obtienes la respuesta que posiblemente esperabas:

Código:
$ perl programa.pl
Esta es la funcion 1
Esta es la funcion 2
Ahora bien, `use' por otra parte es una función orientada a la importación de módulos de una manera un poco más robusta. Es más flexible que `require' en el sentido en que permite definir un conjunto de símbolos específicos que uno quisiera importar desde un módulo.

En este punto, vale la pena mencionar que la elaboración de módulos de Perl es una tarea muy interesante y enriquecedora, pero suele requerir de más trabajo. Es muy recomendable que leas la documentación de Perl respecto a la construcción de nuevos módulos, y el estilo que debe ser usado a la hora de construirlos:

http://www.perldoc.com/perl5.8.0/pod/perlmodlib.html
http://www.perldoc.com/perl5.8.0/pod/perlmodstyle.html

A manera de ejemplo, a continuación veamos cómo podría adaptarse nuestro programa del ejemplo anterior para que fuese un módulo de Perl más completo. Primero, veamos el contenido del archivo llamado `Funciones.pm' (las mayúsculas y minúsculas tienen importancia):

Código:
package Funciones;
 
use strict;
 
BEGIN {
  use Exporter ();
  use vars qw|$VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS|;
 
  $VERSION  = '1.00';  # Version de este modulo
 
  @ISA = qw|Exporter|;
 
  @EXPORT = qw|&funcion1 &funcion2|; # simbolos para exportar por defecto
 
  @EXPORT_OK = qw();  # simbolos para exportar por peticion
 
  %EXPORT_TAGS = ( ); # p.ej.: TAG => [ qw!nombre1 nombre2! ],
}

# Prototipos de funciones, ya sean exportadas o no
 
sub funcion1 ();
sub funcion2 ();
 
END { }
 
 
# El codigo del modulo
 
sub funcion1 ()
{
        print "Esta es la funcion 1\n";
}
  
sub funcion2 ()
{
        print "Esta es la funcion 2\n";
}
 
### Finalizar retornando un valor `verdadero'
1;
Y ahora el código de `programa.pl', el cual no ha cambiado mucho:

Código:
leonardo@max perl $ cat programa.pl
#! /usr/bin/perl -w
use strict;
 
push (@INC, '.');
use Funciones;
 
funcion1 ();
funcion2 ();

Creo que con esto puedes hacerte una idea de cómo opera la importación de módulos en Perl. Por último, una simple anotación: si te es posible hacerlo, puedes leer sobre todos estos temas también en un sistema que posea Perl mediante el comando `perldoc':

Código:
$ perldoc perlfunc
$ perldoc perlmodlib
$ perldoc perlvar
Un cordial saludo
  #3 (permalink)  
Antiguo 29/07/2003, 19:06
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
gracias

gracias, lo voy a leer y luego les digo como me fué
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:58.