Scripting - csrg

Anuncio
Lenguajes de Scripting
Perl
Horst H. von Brand
Departamento de Informática
Universidad Técnica Federico Santa Marı́a
Agenda
Lenguajes de Scripting
Introducción al lenguaje Perl
Detalles del lenguaje
Tipos de datos
Contextos
Operadores
Estructuras de control
Funciones predefinidas
Expresiones regulares
Subrutinas
Estructuras de datos y referencias
Orientación a objetos en Perl
Paquetes
Módulos
Objetos
Agenda
Lenguajes de Scripting
Introducción al lenguaje Perl
Detalles del lenguaje
Tipos de datos
Contextos
Operadores
Estructuras de control
Funciones predefinidas
Expresiones regulares
Subrutinas
Estructuras de datos y referencias
Orientación a objetos en Perl
Paquetes
Módulos
Objetos
Caracterı́sticas de lenguajes de scripting
I
“Script” es guión
I
I
I
I
Caracterı́sticas generales
I
I
I
I
Invocar programas automáticamente
Lenguajes interpretados
Muy alto nivel
Manejo de strings y expresiones regulares
Sin tipos, variables no se declaran
Administración automática de memoria
Caracterı́sticas adicionales comunes
I
I
Empotrable: Puede usarse desde dentro de programas
Extensible: Pueden agregarse nuevas funcionalidades
Algunos lenguajes
I
Perl: Oficialmente, abreviatura de Practical Extraction and
Report Language
I
Python: Por Monty Python
I
PHP: Abreviatura de PHP: Hypertext Processor
I
Ruby: La piedra preciosa (si hay perlas. . . )
I
TCL: Es Tool Control Language, creado con la idea de ser
un lenguaje de extensión/configuración
I
expect: Una extensión de TCL, orientada a controlar
programas interactivos
I
AWK: Lenguaje inventado por Aho, Weinberger,
Kernighan.
Agenda
Lenguajes de Scripting
Introducción al lenguaje Perl
Detalles del lenguaje
Tipos de datos
Contextos
Operadores
Estructuras de control
Funciones predefinidas
Expresiones regulares
Subrutinas
Estructuras de datos y referencias
Orientación a objetos en Perl
Paquetes
Módulos
Objetos
Perl
I
Practical Extracting and Report Language
I
Pathologically Eclectic Rubish Lister
I
Lema: “There’s more than one way to do it” (TMTOWTDI)
I
No pretende ser simple, regular, ortogonal
I
Si aspira a ser cómodo, natural y rápido de usar
Lı́nea de comandos
El tradicional programa en Perl puede escribirse:
perl -e ’print "Hello, world!\n";’
Acá -e indica que el argumento siguiente ha de considerarse
como una lı́nea del script a ser procesado por perl. Para
evitar que el shell interprete el contenido del script (que
comúnmente contendrá caracteres que son especiales para él)
el script mismo se encierra entre apóstrofes.
De ser más extenso el script, es permisible dar -e varias
veces. Cada argumento se considerará una lı́nea aparte.
Lı́nea de comandos
Perl tiene una variedad de flags que controlan su operación.
Por ejemplo, es posible repetir un comando (acá, substituir el
string hoy por ayer) sobre cada lı́nea de los archivos
mencionados, que se editan en su lugar, quedando los
originales en los respectivos .bak:
perl -pi.bak -e ’s/hoy/ayer/g’ uno dos
Algunos flags importantes
Opciones para correr perl en perlrun(1).
Flag
-h
-v
-d
-i<extensión>
-n
-p
Significado
Resumen de las opciones
Versión
Correr en el debugger
Archivos procesados con <> se procesan in situ, dejando el original con la
dada
El programa se aplica a cada lı́nea
El programa se aplica a cada lı́nea,
imprimiendo automáticamente la lı́nea
resultante cada vez
Algunos flags importantes (cont)
Flag
-t
-T
-w
Significado
Activa alertas para tainting, uso
posiblemente riesgoso de datos
externos
Uso riesgoso de datos externos
es un error
Alertar sobre construcciones
dudosas (variables que sólo se
mencionan una vez, redefiniciones de rutinas, . . . )
Ejemplos simples
Contar lı́neas, palabras, caracteres
# ! / usr / bin / p e r l
while (<>) {
$ l i n e s ++;
$words += s p l i t ;
$chars += length ;
}
p r i n t ” $ l i n e s $words $chars \n ” ;
Ejemplos simples
Contar lı́neas, palabras, caracteres – versión “completa”
# ! / u s r / b i n / p e r l −w
use s t r i c t ;
my( $ l i n e , $ l i n e s , $words , $chars , @tmp ) ;
while ( $ l i n e = <STDIN>) {
$ l i n e s ++;
@tmp = s p l i t ( / \ s + / , $ l i n e ) ; $words += @tmp ;
$chars += length ( $ l i n e ) ;
}
p r i n t STDOUT ” $ l i n e s $words $chars \n ” ;
Ejemplos simples
Referencias cruzadas
# ! / usr / bin / p e r l
while (<>) {
foreach $w ( s p l i t ( / \W+ / ) ) {
i f ( ! defined ( $ r {$w } ) ) {
$ r {$w} = $ . ;
} else {
$ r {$w} . = ” , $ . ” unless $ r {$w} =˜ / $ . / ;
}
}
}
foreach $w ( s o r t keys %r ) {
p r i n t ” $w : $ r {$w}\n ” i f $w ;
}
Ejemplos simples
Promedios
# ! / usr / bin / p e r l
open (NOTAS, ”< notas ” ) o r die ” No se puede a b r i r notas ” ;
while (<NOTAS>) {
chomp ;
( $nombre , $nota ) = s p l i t ;
$notas {$nombre} . = $nota . ” ” ;
}
foreach $nombre ( s o r t keys %notas ) {
$suma = $n = 0 ;
foreach $nota ( s p l i t / / , $notas {$nombre } ) {
$suma += $nota ; $n ++;
}
p r i n t $nombre , ” : ” , $notas {$nombre } ,
” \ tPromedio : ” , $suma / $n , ” \n ” ;
}
close (NOTAS ) ;
Ejemplos simples
Entrada y salida
# ! / usr / bin / p e r l
open ( IN , ”< i n p u t ” ) ; chomp( @ l i s t = <IN > ) ; close ( IN ) ;
open (PGM, ” s o r t i n p u t | ” ) ; open (OUT, ”> o u t p u t ” ) ;
while (<PGM>) {
chomp ;
f o r ( $ i = 0 ; $ i <= $# l i s t ; $ i ++) {
p r i n t OUT ” $ i : $ l i s t [ $ i ] \ n ” i f ( $ l i s t [ $ i ] eq $ ) ;
}
}
close (PGM, OUT ) ;
Agenda
Lenguajes de Scripting
Introducción al lenguaje Perl
Detalles del lenguaje
Tipos de datos
Contextos
Operadores
Estructuras de control
Funciones predefinidas
Expresiones regulares
Subrutinas
Estructuras de datos y referencias
Orientación a objetos en Perl
Paquetes
Módulos
Objetos
Tipos de datos básicos
I
$escalar: Strings, números, referencias.
I
@arreglo: Elementos $arreglo[0], . . . , $arreglo[$#arreglo]
I
%hash: Arreglo asociativo, elementos $hash{”clave”}
I
Slices: @arreglo[1, 17, 3], @hash{”uno”, ”doce”, ”nueve”}
I
Inicializar:
I
I
@a = (”Do”, ”Lu”, ”Ma”, ”Mi”, ”Ju”, ”Vi” , ”Sa”);
%h = (”cero” => 0, ”uno” => 1, ”dos” => 2);
Constantes numéricas
I
Decimal: 100
I
Para legibilidad: 1 000
I
Decimales: 3.141592
I
Con exponente: 6.024e24
I
Octal: 0277
I
Hexadecimal: 0x3ff
I
Binario: 0b1010 0011
Constantes string
I
No interpola: ’ Hola!’, o también q($algo)
I
Interpola: ”Variable $a”, incluso qq(Variable $A[$i + 2])
Escapes en strings
Los de C, con algunos adicionales:
Escape
”\cC”
”\x{263a}”
”\N{Nombre}”
Significado
Control-C
Unicode (smiley)
Caracter por nombre
Escapes activos en strings
Código
”\u”
”\l ”
”\U”
”\L”
”\Q”
”\E”
Acción
Siguiente es mayúscula (titlecase)
Siguiente es minúscula
Mayúsculas
Minúsculas
Backslash antes de no-alfanuméricos
Fin de ”\U”, ”\L”, ”\Q”
Contextos
Toda expresión se evalúa en el contexto dado por cómo se usa.
Hay dos contextos básicos:
Escalar: Arreglos dan su largo, hashes dan estadı́sticas de
su uso, y una variedad de funciones entregan
resultados escalares
Lista: Arreglos/listas dan sus valores; hashes dan los
pares (clave, valor) en una lista; escalares dan
una lista de un elemento
Valores de verdad
Cuando se requiere un valor de verdad, esto provee
implı́citamente contexto escalar. Perl usa los siguientes
criterios:
I
Cualquier string, salvo ” ” y ”0”, es verdadero
I
Todo número, salvo 0, es verdadero
I
Cualquier referencia es verdadera
I
Cualquier valor no definido es falso
Operadores
Básicamente los de C, pero con algunas adiciones:
I
Rango: 1..10, \”a0 \”..\” z9\”
I
Concatenación de strings: $saludo . ” , ” . $nombre
(Claro que se escribirı́a ”$saludo, $nombre” más bien)
I
Repetir un string: ”\t ” x ($k / 8) . ” ” x ($k % 8)
I
Potencia: $num ∗∗ 5
Además las combinadas con asignación (salvo rango).
Operadores exóticos
También está el operador coma de C, con el que hay que tener
cuidado:
I
$a = 1, 2, 117; da $a == 117 (Operador coma evalúa sus
argumentos, descarta el primero)
I
@a = 1, 2, 117; da @a == (1, 2, 117) (Es una lista lo que
se asigna)
I
$a = (1, 2, 117); da $a == 3 (Lista en contexto escalar)
El sı́mbolo => es el equivalente de coma, pero cita la palabra a
su izquierda: hoy => 3 es equivalente a ’ hoy’, 3 (más que
nada útil para inicializar hashes)
Asignación en Perl
I
En Perl la asignación es un operador que entrega el lvalue
I
Ası́, puede transformarse $t de Fahrenheit a Celsius
mediante ($t −= 32) ∗ 5 / 9;
Asignación en Perl: Arreglos
I
Pueden asignarse arreglos completos, por ejemplo
@a = @b; o @a = (1, 2, 4, 8, 16);
I
El lado izquierdo puede ser una lista de variables, o sea:
($a, $b) = (42, 117);
I
Las asignaciones se hacen en paralelo, o sea
($a, $b) = ($b, $a); intercambia los valores de $a y $b
I
De asignarse más valores, los sobrantes se descartan
I
Si hay arreglos, el primero consume todos los valores
restantes: ($a, $b, @resto) = (1, 2, 3, 4, 5, 6);
I
Puede asignarse a undef para descartar valores. Si
interesan sólo el segundo y cuarto de lo que retorna
&unafunc: (undef, $a, undef, $b) = unafunc();
Operadores lógicos adicionales
Hay operadores lógicos de muy baja precedencia equivalentes
a sus versiones tradicionales (not, and, or, xor), usados más
que nada por su evaluación en cortocircuito:
open(IN, ”< $file” ) or die ”Can’t open $file” ;
/ˆ #/ and next;
Comparaciones
Comparación
Menor que
Menor o igual que
Igual a
Mayor o igual que
Mayor que
No igual a
Comparar
Número
<
<=
==
>=
>
!=
<=>
String
lt
le
eq
ge
gt
ne
cmp
Estructuras de control
i f ( CONDITION ) {
...
}
e l s i f ( CONDITION ) {
...
}
else {
...
}
unless ( CONDITION ) {
...
}
Estructuras de control
while ( CONDITION ) {
...
last ;
...
next ;
...
} continue {
...
}
Estructuras de control
u n t i l ( CONDITION ) {
...
last ;
...
next ;
...
} continue {
...
}
Estructuras de control
f o r ( I N I T ; CONDITION ; UPDATE) {
...
next ;
...
last ;
...
}
Estructuras de control
foreach VAR ( LIST ) {
...
next ;
...
last ;
...
}
Modificadores
...
i f ( CONDITION ) ;
. . . unless ( CONDITION ) ;
. . . while ( CONDITION ) ;
. . . u n t i l ( CONDITION ) ;
. . . foreach LIST ;
Modificadores
do {
...
} while ( CONDITION ) ;
do {
...
} u n t i l ( CONDITION ) ;
Rótulos de ciclos
LABEL : {
...
next LABEL ;
...
l a s t LABEL ;
...
}
Funciones predefinidas
Manejo de arreglos como deque
I
push ARRAY, LIST
I
$var = pop ARRAY
I
$var = shift ARRAY
Por omisión, @ARGV o @
I
unshift ARRAY, LIST
Funciones predefinidas
Combinar/dividir strings
I
join EXPR, LIST
I
split /PATTERN/, EXPR, LIMIT
O sea, se puede hacer algo como:
perl -e ’print join(" ", split //, shift), "\n";’ ’
Funciones predefinidas
Manipulación de arreglos
I
sort BLOCK ARRAY
BLOCK compara $a con $b
I
map BLOCK ARRAY o map EXPR, ARRAY
I
grep BLOCK ARRAY o grep EXPR, ARRAY
Funciones predefinidas
Manipulación de strings
I
lc EXPR, uc EXPR
I
lcfirst EXPR, ucfirst EXPR
Funciones predefinidas
Otras clases
I
Manipulación de procesos
I
Hebras (threads)
I
Numéricas
I
Llamadas propias de U NIX
Un ejemplo de uso
Datos
Supongamos que tenemos un archivo con el siguiente
“creativo” formato. Viene ordenado por apellido:
HERNANDEZ:GOMEZ:LUIS:234567-8
IN:OUT:GIGO:891234-6
LI:CHIANG:DANIEL ALBERTO:345678-9
NOGUERA:NORAMBUENA:NELLY NORA:987654-3
PEREZ:LOPEZ:JUAN PABLO:123456-7
SALGADO:NARDEZ:JOSEFO LUIS ALBERTO JAVIER:456789-K
ZAMORA:YUMA:ADAN BENJAMIN CARLOS DAVID:132547-6
Un ejemplo de uso
Salida deseada
Se requiere un archivo con el rol, seguido por el nombre. Debe
estar ordenado por rol:
123456-7:
132547-6:
234567-8:
345678-9:
456789-K:
891234-6:
987654-3:
Juan Pablo Perez Lopez
Adan Benjamin Carlos David Zamora Yuma
Luis Hernandez Gomez
Daniel Alberto Li Chiang
Josefo Luis Alberto Javier Salgado Nardez
Gigo In Out
Nelly Nora Noguera Norambuena
Un ejemplo de uso
El programa
# ! / usr / bin / p e r l
open (OUT, ” | s o r t ” ) ;
while (<>) {
chomp ;
@a = map { j o i n ’ ’ , map { u c f i r s t l c } s p l i t }
split / : / ;
p r i n t OUT ” \U$a [ 3 ] : ” , j o i n ( ’ ’ , @a[ 2 , 0 , 1 ] ) ,
” \n ” ;
}
close (OUT ) ;
Referencias cruzadas
Una versión más sofisticada
# ! / usr / bin / p e r l
while (<>) {
foreach ( s p l i t / \W+ / ) {
/ ˆ $ / and next ;
$ref {$ } .= $ref {$ } ? ” , $ . ” : $ .
unless $ r e f { $ } =˜ / $ . / ;
}
}
p r i n t map ” $ : $ r e f { $ }\n ” , s o r t keys %r e f ;
Operadores especiales
Común
’ ... ’
” ... ”
‘...‘
/.../
General
q {...}
qq{...}
qx{...}
qw{...}
m{...}imosx
qr {...} imosx
s {...}{...} egimosx
tr {...}{...} cds
Int
No
Si
Si
No
Si
Si
Si
No
Significa
String
String
Comando
Palabras
Calza patrón
Patrón
Reemplazo
Transliterar
Los delimitadores pueden ser “cualquier cosa” (no
alfanuméricos, claro), pero generalmente se usan /.../ . O
pueden usarse diversos tipos de paréntesis ()[]{}<>, que
deben parearse.
Operadores especiales
Calce de patrón
En m /.../ imosx y qr /.../ imosx:
i
m
o
s
x
No distinga mayúsculas/minúsculas
Múltiples lı́neas
Compilar una sola vez (once)
Una sola lı́nea
Expresiones regulares extendidas
qr /.../ retorna un objeto que puede darse en vez de un patrón
al buscar/reemplazar.
Operadores especiales
Reemplazo
En s /.../.../ egimosx:
e
g
i
m
o
s
x
Lado derecho es expresión
Globalmente
No distinga mayúsculas/minúsculas
Múltiples lı́neas
Compilar una sola vez (once)
Una sola lı́nea
Expresiones regulares extendidas
Operadores especiales
Transliterar
En tr /BUSCA/REEMPLAZO/cds:
c
d
s
Complemento
Elimine los sin traducción (delete)
Secuencias duplicadas se reducen a uno (squash)
tr /A−J/0−9/: Como tr /ABCDEFGHIJ/0123456789/
tr/0−9/9/
tr /A−Za−z//s: ’Mississippi’
’Misisipi’
Aplicar a variables
Las operaciones anteriores operan sobre la variable por
omisión $ .
Para operar sobre otra variable se usa, por ejemplo:
$var =˜ s/hoy/ayer/;
Incluso es posible aplicar estas operaciones “al pasar”:
($var = alguna fea expresion) ˜= tr /aeiou//d;
(recuérdese que la asignación da un lvalue)
Expresiones regulares
Son patrones de búsqueda en texto. Siendo Perl un lenguaje
basado en manipular texto, son fundamentales. Mucha
manipulación de texto es “búsqueda y reemplazo”, donde
obviamente son parte central.
Las de Perl existen también como biblioteca aparte para uso
en otros programas: PCRE. En rigor, no son expresiones
regulares, pero no seremos nosotros quienes cambien el uso
del término. . .
Expresiones regulares
En los patrones hay caracteres “normales” (que se representan
a sı́ mismos) y metacaracteres, con significado especial. En
Perl todos los metacaracteres son caracteres no alfanuméricos,
y todos ellos pierden su significado especial si se preceden con
backslash. Esta es la función del escape ”\Q...\E”.
Expresiones regulares
Cada construcción calza con un patrón dado, en una posición
especı́fica. A las construcciones que sólo registran una
posición (no calzan con caracteres) les llaman anchor.
Las construcciones en general son voraces: Calzan lo más que
pueden. Pero también son poco previsoras: Calzan en la
primera oportunidad, aunque hayan calces “mejores” más
adelante.
Expresiones regulares
Caracteres individuales
. Calza con cualquier caracter (salvo ”\n”, si /s)
[...] Conjunto de caracteres.
ˆ niega, – rango.
[: ... :] conjunto POSIX
Expresiones regulares
Caracteres individuales
”\w”
”\W”
”\s”
”\S”
”\d”
”\D”
Palabra (alfanumérico y )
No-palabra
Espacio
No-espacio
Dı́gito
No-dı́gito
Expresiones regulares
Operadores
* Repetir lo anterior cero o más veces
+ Repetir lo anterior una o más veces
? Lo anterior es opcional
{m, n} Repetir lo anterior entre m y n veces, {n}
exactamente n veces, {n,} al menos n veces
| Alternativas
(...) Agrupa (y recuerda en ”\1” y $1, . . . )
Expresiones regulares
Anchors
ˆ Principio del string (o la lı́nea, si /m)
$ Fin del string (o la lı́nea, si /m)
Expresiones regulares
Anchors
”\b”
”\B”
”\A”
”\Z”
”\z”
Borde de palabra
No-borde de palabra
Principio del string
Final del string (o antes de ”\n” final)
Final del string
Expresiones regulares extendidas
Permite espacios y comentarios.
(?imsx–imsx) Opciones (– apaga)
+?, *? Mı́nimo posible (no voraz)
(?# ...) Comentario
(?: ...) Agrupa sin recordar, (?imsx–imsx: ...) con
opciones
(?= ...) Lookahead positivo, (?! ...) negativo
Hay mas. . .
Búsquedas y reemplazos
m/(\w+) \1/ # Palabras repetidas
($h, $m, $s) = $hms =˜ m/(\d+):(\d+):(\d+)/;
m{ˆ(.∗): GIF}; # Ahora $1 es lo que calza
s<ˆ(?:foo|bar)([0−9]+)>[$1−baz−$1]
s/(\[0−9\]+)/$1 + 3/ge
Subrutinas
Un ejemplo simple
# ! / usr / bin / p e r l
sub Ul
{
my $x = s h i f t ;
r e t u r n u c f i r s t l c $x ;
}
while (<>) {
p r i n t Ul $ ;
}
Subrutinas
Manejo de arreglos
# ! / usr / bin / p e r l
sub acc
{
my $s ;
foreach (@ ) {$s += $ ; $
return @ ;
= $s ; }
}
while (<>) { p r i n t j o i n ’ ’ , acc s p l i t ; p r i n t ” \n ” ; }
Subrutinas – definición general
Prototipos
La definición general de subrutina tiene la forma:
sub NAME(PROTO): ATTRS BLOCK
I
El prototipo y los atributos son opcionales.
I
Si no hay bloque, es declaración únicamente.
I
Si no se da nombre, es anónima.
Subrutinas – definición general
Prototipos
$
@
\@
\%
&
∗
\[$@]
\ %;$
Escalar
Arreglo
Referencia a arreglo
Referencia a hash
Bloque
Glob
Escalar o arreglo
Referencia a hash, escalar opcional
Subrutinas – definición general
Atributos
Mecanismo para limitar acceso o dar información sobre la
subrutina. Básicamente definido por el usuario.
Múltiples dimensiones
En Perl es posible escribir por ejemplo:
$a [3][4] = $b{’Lu’}[2]{ ’ C−201’}
Claro que esto es diferente de lo que parece. . .
Tenemos un hash %b que bajo ’ Lu’ tiene una referencia a un
arreglo anónimo, cuyo tercer elemento es una referencia a un
hash anónimo del cual tomamos el valor con clave ’ C−201’.
Manejo explı́cito de referencias
Podemos depositar una referencia en una variable
$a = \$x; $b = \@y; $c = \ %h;
y después usarla descaradamente
${$a} = 37; push @{$b}, (1, 2, 3); ${$c}{’Lu’} .= ” , FIS”;
desmanes que son aplicables también a rutinas
sub una fun; $f = \&una fun; &{$f}(1, 2, 3);
donde nada impide que tengamos arreglos (o hashes) con
elementos de diferentes tipos. . .
Objetos anónimos
Podemos crear objetos anónimos de los distintos tipos, y
asignar referencias a ellos:
$a[0] = [1, 2, $x, @y];
# Arreglo
$a[1] = {’uno’ => 1, ’dos’ => 2}; # Hash
$a[2] = sub {map $ ∗ 3, @ };
# Rutina
Un ejemplo extraño
# ! / usr / bin / p e r l
$a [ 0 ] = [ 0 , 1 , 2 ] ; $a [ 0 ] [ 3 ] = 3 ; push @{$a [ 0 ] } , 4 , 5 ;
$a [ 1 ] = { ’ uno ’ => 1 , ’ dos ’ => 2 } ;
$a [ 1 ] { ’ t r e s ’ } = 3 ;
$a [ 2 ] = sub {map $
∗ 3 , @ };
p r i n t ” $ : $a [ 1 ] { $ }\n ” foreach ( s o r t keys %{$a [ 1 ] } ) ;
p r i n t j o i n ( ’ ’ , $a [ 2 ] (@{$a [ 0 ] } ) ) , ” \n ” ;
Agenda
Lenguajes de Scripting
Introducción al lenguaje Perl
Detalles del lenguaje
Tipos de datos
Contextos
Operadores
Estructuras de control
Funciones predefinidas
Expresiones regulares
Subrutinas
Estructuras de datos y referencias
Orientación a objetos en Perl
Paquetes
Módulos
Objetos
Paquetes
# ! / usr / bin / p e r l
package Saludos ;
$Despedida = ” Chao . . . ” ;
$ h i = ” Hola ! ” ;
sub bye ( ) { $Despedida ; }
package main ;
p r i n t $Saludos : : h i . ” \n ” ;
p r i n t Saludos : : bye ( ) . ” \n ” ;
Módulos
El usuario
# ! / usr / bin / p e r l
use Modulo ;
p r i n t f u n c @ARGV;
p r i n t ” \n ” ;
Módulos
El módulo mismo
# Modulo .pm
package Modulo ;
BEGIN {
use E x p o r t e r ( ) ;
our ( $VERSION , @ISA,
@EXPORT, @EXPORT OK, %
EXPORT TAGS ) ;
@ISA
= qw( E x p o r t e r ) ;
@EXPORT
= qw(& f u n c ) ;
}
sub f u n c { ” | ” . ( j o i n ’ : ’ , @ ) . ” | ” ; }
1;
Objetos en Perl
1. Un objeto es una referencia que sabe a qué clase
pertenece
2. Una clase es un paquete que provee métodos para
referencias a objetos
3. Un método es una subrutina que recibe una referencia a
un objeto (o el nombre del paquete, para métodos de
clase) como primer argumento
Estructura de la herencia
I
El arreglo @ISA de la clase contiene los nombres de las
clases base. Búsqueda de métodos es en profundidad, de
derecha a izquierda.
I
Toda clase hereda de UNIVERSAL
Sintaxis de llamadas
$mage = Wizard−>summon ( ” Gandalf ” ) ; # Metodo de c l a s e
$mage−>speak ( ” f r i e n d ” ) ;
# de i n s t a n c i a
$ c l a s e = r e f ( $mage ) ;
# Clase a l a que pertenece
$ t r a v e l = $companion eq ” Shadowfax ” ? ” r i d e ” : ” walk ” ;
$mage−>$ t r a v e l ( ” seven leagues ” ) ; # Metodo r i d e o walk
Crear objetos
La función bless asocia una referencia con un paquete:
$ o b j = { } ; # R e f e r e n c i a a hash anonimo
bless ( $ o b j ) ; # En paquete a c t u a l
bless ( $obj , ” C r i t t e r ” ) ; # En paquete C r i t t e r
Comúnmente se usan hashes como almacenamiento de los
objetos, pero puede usarse cualquier tipo de referencia.
Ejemplo de clase
Definición de la clase
# Clase .pm
package Clase ;
sub new {
my $ i n v o c a n t = s h i f t ;
my $ c l a s s = r e f ( $ i n v o c a n t ) | | $ i n v o c a n t ;
my $ s e l f = { @ } ; bless ( $ s e l f , $ c l a s s ) ;
return $ s e l f ;
}
sub get name ( ) { ${ $ [ 0 ] } { name } ; }
1;
Ejemplo de clase
Uso de la clase
# ! / usr / bin / p e r l
use Clase ;
$ o b j = Clase−>new ( name => ” i n t i ” ) ;
p r i n t $obj−>get name , ” \n ” ;
Descargar