programación ii
DESCRIPTION
9 – Perl II. Programación II. Ing. Diego J. Arcusin [email protected]. Namespaces. El perl provee mecanismos para proteger las variables. La función package - PowerPoint PPT PresentationTRANSCRIPT
Namespaces
El perl provee mecanismos para proteger las variables.
La función package Permite la definición de “namespaces”. En un namespace cada una de las
variables es única. De esta manera se pueden utilizar dos variables distintas
con el mismo nombre, cada una de ellas en un Namespace diferente. El Namespace main es el namespace default por lo que todo programa perl
tiene implicita la instrucción: package main;
En realidad en perl no existe tal cosa La variable _PACKAGE_ forma parte de perl, y contiene el nombre del
namespace actual Para más información: perldoc -f package
Ejemplo de namespaces#!/usr/bin/perl my $saludos = “Desde cualquier lado: Saludos de ";
# Namespace ‘Ucema' package Ucema; $promedio = 8; print 'En namespace '.__PACKAGE__.', $promedio = ', $promedio, "\n"; print $saludos,__PACKAGE__,"\n";
# Namespace ‘Uade' package Uade; $promedio = 5; print 'En namespace '.__PACKAGE__.', $promedio = ', $promedio, "\n"; print $saludos,__PACKAGE__,"\n";
# Namespace 'main' (default namespace) package main; $promedio = 7;print 'En namespace '.__PACKAGE__.', $promedio = ', $promedio, "\n"; print ‘Promedio publico: ', $main::promedio, "\n"; print ‘Promedio Ucema: ', $Ucema::promedio, "\n"; print ‘Promedio Uade: ', $Uade::promedio, "\n"; print $saludos,__PACKAGE__,"\n";
Alcance de las variables
Las variables declaradas con my son acccesibles
dentro de un determinado alcance (scope), pero no
fuera del mismo.El alcance de la variable está dado por el bloque
actual donde se encuentra el código.El alcance puede ser un loop, una subrutina, o un
programa completo.
Módulos
Perl permite el desarrollo de módulos
personalizados para ser utilizados en lugar de las
subrutinas.La función use se utiliza para acceder a un módulo
desde un programa.Un módulo es un archivo de texto con código perl
qué suele terminar con la extensión .pm
Ejemplo de módulo
Módulo Ucema.pm:# Namespace ‘Ucema' package Ucema; $promedio = 8; my $costo = 500; 1;
Módulo Uade.pm:# Namespace ‘Uade' package Uade; $promedio = 5; my $costo = 300; 1;
Ejemplo de módulo (cont.) Programa programa.pl:#!/usr/bin/perl use strict; use Ucema; use Uade; my $promedio = 7; print 'Mi promedio: ', $promedio, "\n"; print ‘Promedio de Ucema: ', $Ucema::promedio, "\n"; print ‘Promedio de Uade: ', $Uade::promedio, "\n"; print “Los costos de las Universidad fueron declarados con 'my':\n"; print '$Ucema::costo no es accesible desde aca', "\n"; print '$Uade::costo tampoco', "\n";
La linea use Ucema; busca el archivo de nombre Ucema con extensión .pm, y luego importa el namespace Ucema con todos los subrutinas y variables públicas que tenga este módulo.La función use indica éxito con True, por eso la última linea de un módulo tiene que evaluar a True, por esto todos los módulos terminan con 1;.
La variable $costo está declarada con my (o sea privada). Esto quiere decir que solo está accesible dentro del scope del archivo Ucema.pm, y no desde programa.pl, mientras que $promedio está declarada como pública, y por lo tanto accesible desde programa.pl.
Otro ejemplo
Módulo Trim.pm:# Trim.pmpackage Trim; sub ltrim {
$string = shift; $string =~ s/^\s*//g; return $string;
} sub rtrim {
$string = shift; $string =~ s/\s*$//g; return $string;
} sub trim {
$string = shift; $string =~ s/^\s*(\S+)\s*$/$1/g; return $string;
} 1;
programa2.pl:
#!/usr/bin/perl
use Trim;
my $s = ' hola ';
my $s2 = Trim::trim($s);
my $s3 = Trim::ltrim($s);
my $s4 = Trim::rtrim($s);
print "$s\n";
print "$s2\n";
print "$s3\n";
print "$s4\n";
Otro ejemplo (cont.)
"The Comprehensive Perl Archive Network“ Es un directorio central donde se almacenan módulos
y programas perl creados por terceras personas que integran operaciones habituales .
Contiene un mecanismo de búsqueda junto con él directorio organizado en categorías específicas donde se pueden crear módulos prediseñados.
http://www.cpan.org Algunos módulos de CPAN:
DBI DBD CGI MAILHTML NET FIND XML
Y otros.
CPAN
En Perl la terminología de Object-Oriented (OO) programming se aplica de la
siguiente manera:
Un objeto es una variable que pertenece a una clase. Métodos son funciones asociadas a objetos o clases. Propiedades de instancia son propiedades que afectan sólo al objeto. Propiedades de clase son propiedades que afectan a todos los objetos de la
clase. Una clase es un Package, y normalmente un módulo, o sea un
archivo .pm. El objeto (o variable) es una referencia a la que se le ha aplicado la función
bless.
Clases y Objetos
Clases vs. Librería: Similitudes y diferencias: Las dos se almacenan en un archivo .pm. Una clase es un conjunto de métodos (subrutinas), pero incluye un método
normalmente (pero no necesariamente) llamado new(), que crea un objeto.
A través de este método se puede acceder a los demás métodos. Además, un objeto cuenta con propiedades, que se pueden modificar a traves
de métodos. Esto permite a un objeto llevar distintos estados durante la
ejecución de un programa.
Una libreria es un conjunto de funciones (subrutinas) con algo en común (por
eso se almacenan en el mismo archivo), que se pueden ejecutar desde un
programa, pero estas funciones no llevan un estado (como lo hace un objeto),
solo devuelve uno o varios valores.
Clases vs. Librerías
Un objeto en perl no es más que una referencia de la cuál se sabe a que clase pertenece. Una clase es un package que provee métodos para tratar con las referencias a objetos Un método es una simple subrutina que espera una referencia a un objeto como primer
argumento En Perl un objeto se crea con la función bless enviando como argumento la
referencia al objeto (ver perldoc -f bless por detalles). En teoría, la referencia puede referirse a cualquier tipo de variable, pero en general
siempre se refiere a un hash vacío. Normalmente se crea un objeto a través de una función llamada new ( )
# Crear el objetosub new {
my $class = shift; return bless {}, $class;
} Podemos llamar a new de dos formas:
my $object = Some::Class->new(); o bien: my $object = new Some::Class;
Un objeto en perl
Todas las subrutinas dentro de Some/Class.pm sirven
como métodos, y aquellas subrutinas que modifican o
devuelven valores del hash del objeto sirven como
propiedades. Este ejemplo agrega un método y una propiedad al archivo
Some/Class.pm: sub un_metodo {
print "Hola!\n“}; sub una_propiedad {
my $object = shift; $object->{PROPIEDAD} = shift if @_;
return $object->{PROPIEDAD}; }
Métodos y Propiedades
Para acceder a los métodos y las propiedades desde un programa:
#!/usr/bin/perl -w use strict; use Some::Class; my $object = Some::Class->new();
# Acceder a un metodo $object->un_metodo; # Acceder a una propiedad - siempre se debe hacer a traves de un metodo # Propiedad - set $object->una_propiedad(123); # Propiedad - get print $object->una_propiedad(),"\n";
Métodos y Propiedades (cont.)
Es importante resaltar que es posible acceder directamente el
valor del hash (en este ejemplo $object->{PROPIEDAD})
en vez de usar el método una_propiedad para hacerlo, pero
no es una forma adecuada de programación.
El método una_propiedad de Some::Class puede contener
funcionalidad agregada que debe ser transparente al usuario
de Some::Class.
La documentación del módulo debe indicar que métodos se
deben usar.
Métodos y Propiedades (cont.)
Preguntas
?
1) Dado un archivo de Log de un Servidor Web con la siguiente estructura:
Dirección IP | Fecha y Hora | URL Visitada | Navegador Utilizado
Existe un registro para cada solicitud realizada al servidor.La Fecha y Hora tiene el siguiente formato: DD/MMM/YYYY:hh:mm:ssEjemplo: 05/Dec/2005:10:16:05Se solicita:
• Proveer la lista de todos los navegadores con los que se accedió al sitio y el porcentaje de utilización de cada uno (Cantidad de registros accedidos por cada navegador / cant, total de registros).
• Contar cuántas imágenes se accedieron en el mes de Noviembre del 2005. (Las imágenes son aquellas URLs que terminan en .gif, .jpg o .png)
• Armar una lista ordenada con todas las direcciones IP distintas que accedieron a la URL: http://www.sitio.com.ar/loginincorrect.php
Ejercicios
2. Hemos sido contratados para formar parte del Staff de Operaciones del Area de Sistemas de Editorial “Libros lo más”. Nuestro jefe, sabiendo acerca de nuestros conocimientos de UNIX y perl nos solicita:
a) Para un proyecto de reingeniería del sistema de Facturación de la Editorial, desarrollar un módulo perl que contenga una clase denominada “libro” que contenga los siguientes métodos:
New: • Crea un nuevo libro. • Para poder crear un nuevo objeto “libro”, este método deberá recibir el código de ISBN y el título del libro. • Al crearse el libro toma el estado “Sin Publicar” , una cantidad en Stock de 0 unidades, y una cantidad de ventas totales
en 0.
Imprimir:• Recibe como parámetro la cantidad de copias impresas del libro. Esta cantidad se suma al stock disponible.• Además, cambia el estado del libro a “Disponible”.
Venta: • Recibe como parámetro la cantidad de copias vendidas del libro.• Si la cantidad de copias es mayor al stock actual. Vuelve con un error.• Si la cantidad de copias es menor o igual al stock actual, se disminuye la cantidad de copias en stock de acuerdo a la
venta, y se incrementa un acumulador de ventas totales de acuerdo a la cantidad vendida.• Si la cantidad en stock llega a cero, el estado pasa a ser “Agotado”.
Estado:• Retorna el Estado actual del libro.
Stock:• Retorna el Stock actual del libro.
Ejercicios
b) Preparar un listado con los libros impresos en Argentina con los que cuenta la Editorial.
Deberemos elaborar un programa perl que muestre todos los titulos por orden alfabético.
Contamos con un archivo con los datos de los libros publicados por la editorial con el siguiente formato:ISBN DEL LIBRO|COD AUTOR|TITULO|CODIGO DE CONTROL
Ejemplo de registros:590-24-1121-8|00230120|Poda|5400006699950-24-0938-8|00329311|Adiestramiento Canino|5400006600590-24-1122-6|00230120|Rosas|5400006600…950-24-0975-2|01000023|Feng Shui Soluciones Prácticas|010006699
Nota 1: No considerar aquellos libros cuyo código de control finalice en 99 ya que los códigos que terminan con este número indican que el mismo está agotado.
Nota 2: Considerar sólo aquellos libros cuyo código de control comience con 54 ya que los códigos que comienzan con este número indican que el mismo fue publicado en Argentina.
Ejercicios