formato de apunte - csrg

Anuncio
Lenguajes de Scripting
Perl
Horst H. von Brand
Agenda
Índice
1. Lenguajes de Scripting
1
2. Introducción al lenguaje Perl
2
3. Detalles del lenguaje
3.1. Tipos de datos . . . . . . . . . . .
3.2. Contextos . . . . . . . . . . . . .
3.3. Operadores . . . . . . . . . . . .
3.4. Estructuras de control . . . . . . .
3.5. Funciones predefinidas . . . . . .
3.6. Expresiones regulares . . . . . . .
3.7. Subrutinas . . . . . . . . . . . . .
3.8. Estructuras de datos y referencias .
.
.
.
.
.
.
.
.
4
4
5
5
7
8
11
13
14
4. Orientación a objetos en Perl
4.1. Paquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2. Módulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3. Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
14
15
1.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Lenguajes de Scripting
Caracterı́sticas de lenguajes de scripting
“Script” es guión
• Invocar programas automáticamente
• Lenguajes interpretados
• Muy alto nivel
Caracterı́sticas generales
• Manejo de strings y expresiones regulares
• Sin tipos, variables no se declaran
• Administración automática de memoria
Caracterı́sticas adicionales comunes
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
• Empotrable: Puede usarse desde dentro de programas
• Extensible: Pueden agregarse nuevas funcionalidades
Algunos lenguajes
Perl: Oficialmente, abreviatura de Practical Extraction and Report Language
Python: Por Monty Python
PHP: Abreviatura de PHP: Hypertext Processor
Ruby: La piedra preciosa (si hay perlas. . . )
TCL: Es Tool Control Language, creado con la idea de ser un lenguaje de extensión/configuración
expect: Una extensión de TCL, orientada a controlar programas interactivos
AWK: Lenguaje inventado por Aho, Weinberger, Kernighan.
2.
Introducción al lenguaje Perl
Perl
Practical Extracting and Report Language
Pathologically Eclectic Rubish Lister
Lema: “There’s more than one way to do it” (TMTOWTDI)
No pretende ser simple, regular, ortogonal
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
2
Algunos flags importantes
Opciones para correr perl en perlrun(1).[3ex]
Flag
Significado
-h
Resumen de las opciones
-v
Versión
-d
Correr en el debugger
-i<extensión>
Archivos procesados con <> se procesan in situ, dejando el original
con la ¡extensión¿ dada
-n
El programa se aplica a cada lı́nea
El programa se aplica a cada lı́nea, imprimiendo automáticamente la
-p
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
# ! / 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
# ! / 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
# ! / usr / bin / p e r l
while (<>) {
foreach $w ( s p l i t ( / \W+ / ) ) {
i f ( ! defined ( $ r {$w } ) ) {
$ r {$w} = $ . ;
3
} 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
# ! / 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
# ! / 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 ) ;
3.
3.1.
Detalles del lenguaje
Tipos de datos
Tipos de datos básicos
$escalar: Strings, números, referencias.
@arreglo: Elementos $arreglo[0], . . . , $arreglo[$#arreglo]
%hash: Arreglo asociativo, elementos $hash{”clave”}
Slices: @arreglo[1, 17, 3], @hash{”uno”, ”doce”, ”nueve”}
4
Inicializar:
• @a = (”Do”, ”Lu”, ”Ma”, ”Mi”, ”Ju”, ”Vi” , ”Sa”);
• %h = (”cero” => 0, ”uno” => 1, ”dos” => 2);
Constantes numéricas
Decimal: 100
Para legibilidad: 1 000
Decimales: 3.141592
Con exponente: 6.024e24
Octal: 0277
Hexadecimal: 0x3ff
Binario: 0b1010 0011
Constantes string
No interpola: ’ Hola!’, o también q($algo)
Interpola: ”Variable $a”, incluso qq(Variable $A[$i + 2])
Escapes en strings
Escape
”\cC”
Los de C, con algunos adicionales: [1ex]
”\x{263a}”
”\N{Nombre}”
Significado
Control-C
Unicode (smiley)
Caracter por nombre
Escapes activos en strings
Código
Acción
”\u”
Siguiente es mayúscula (titlecase)
Siguiente es minúscula
”\l ”
Mayúsculas
”\U”
”\L”
Minúsculas
Backslash antes de no-alfanuméricos
”\Q”
Fin de ”\U”, ”\L”, ”\Q”
”\E”
3.2.
Contextos
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
5
Valores de verdad
Cuando se requiere un valor de verdad, esto provee implı́citamente contexto escalar. Perl usa los siguientes criterios:
Cualquier string, salvo \”\” y \”0\”, es verdadero
Todo número, salvo 0, es verdadero
Cualquier referencia es verdadera
Cualquier valor no definido es falso
3.3.
Operadores
Operadores
Básicamente los de C, pero con algunas adiciones:
Rango: 1..10, \”a0 \”..\” z9\”
Concatenación de strings: $saludo . ” , ” . $nombre
bien)
(Claro que se escribirı́a ”$saludo, $nombre” más
Repetir un string: ”\t ” x ($k / 8) . ” ” x ($k % 8)
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:
$a = 1, 2, 117; da $a == 117 (Operador coma evalúa sus argumentos, descarta el primero)
@a = 1, 2, 117; da @a == (1, 2, 117) (Es una lista lo que se asigna)
$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
En Perl la asignación es un operador que entrega el lvalue
Ası́, puede transformarse $t de Fahrenheit a Celsius mediante ($t −= 32) ∗ 5 / 9;
Asignación en Perl: Arreglos
Pueden asignarse arreglos completos, por ejemplo @a = @b; o @a = (1, 2, 4, 8, 16);
El lado izquierdo puede ser una lista de variables, o sea: ($a, $b) = (42, 117);
Las asignaciones se hacen en paralelo, o sea ($a, $b) = ($b, $a); intercambia los valores de $a y $b
De asignarse más valores, los sobrantes se descartan
Si hay arreglos, el primero consume todos los valores restantes: ($a, $b, @resto) = (1, 2, 3, 4, 5, 6);
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();
6
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: [1ex] open(IN, ”< $file” ) or die ”Can’t open $file” ;
[1ex] /ˆ #/ and next;
Comparaciones
Comparación
Menor que
Menor o igual que
Igual a
Mayor o igual que
Mayor que
No igual a
Comparar
3.4.
Número
<
<=
==
>=
>
!=
<=>
String
lt
le
eq
ge
gt
ne
cmp
Estructuras de control
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 {
7
...
}
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 ;
...
}
8
3.5.
Funciones predefinidas
Funciones predefinidas
push ARRAY, LIST
$var = pop ARRAY
$var = shift ARRAY
Por omisión, @ARGV o @
unshift ARRAY, LIST
Funciones predefinidas
join EXPR, LIST
split /PATTERN/, EXPR, LIMIT
O sea, se puede hacer algo como:
perl -e ’print join(" ", split //, shift), "\n";’ ’Alguna cháchara’
Funciones predefinidas
sort BLOCK ARRAY
BLOCK compara $a con $b
map BLOCK ARRAY o map EXPR, ARRAY
grep BLOCK ARRAY o grep EXPR, ARRAY
Funciones predefinidas
lc EXPR, uc EXPR
lcfirst EXPR, ucfirst EXPR
Funciones predefinidas
Manipulación de procesos
Hebras (threads)
Numéricas
Llamadas propias de U NIX
Un ejemplo de uso
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
9
Un ejemplo de uso
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
# ! / 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
# ! / 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
Int
Significa
’ ... ’
q {...}
No String
” ... ”
qq{...}
Si
String
‘...‘
qx{...}
Si
Comando
[3ex] Los delimitadores pueden ser “cualquier cosa” (no
qw{...}
No Palabras
/.../
m{...}imosx
Si
Calza patrón
Si
Patrón
qr {...} imosx
s {...}{...} egimosx Si
Reemplazo
tr {...}{...} cds
No Transliterar
alfanuméricos, claro), pero generalmente se usan /.../ . O pueden usarse diversos tipos de paréntesis ()[]{}<>, que
deben parearse.
Operadores especiales
10
i
No distinga mayúsculas/minúsculas
m Múltiples lı́neas
En m /.../ imosx y qr /.../ imosx: [1ex] o Compilar una sola vez (once)
[1ex] qr /.../ retorna un obs
Una sola lı́nea
x Expresiones regulares extendidas
jeto que puede darse en vez de un patrón al buscar/reemplazar.
Operadores especiales
e
g
i
En s /.../.../ egimosx: [1ex] 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
c
En tr /BUSCA/REEMPLAZO/cds: [1ex] d
s
Como tr /ABCDEFGHIJ/0123456789/
tr/0−9/9/
tr /A−Za−z//s: ’Mississippi’ ’Misisipi’
Complemento
Elimine los sin traducción (delete)
[1ex] tr /A−J/0−9/:
Secuencias duplicadas se reducen a uno (squash)
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)
3.6.
Expresiones regulares
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.
11
Expresiones regulares
. Calza con cualquier caracter (salvo ”\n”, si /s)
[...] Conjunto de caracteres.
ˆ niega, – rango.
[: ... :] conjunto POSIX
Expresiones regulares
”\w” Palabra (alfanumérico y )
”\W” No-palabra
”\s”
Espacio
”\S” No-espacio
Dı́gito
”\d”
”\D” No-dı́gito
Expresiones regulares
* 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
ˆ Principio del string (o la lı́nea, si /m)
$ Fin del string (o la lı́nea, si /m)
Expresiones regulares
”\b” Borde de palabra
”\B” No-borde de palabra
”\A” Principio del string
”\Z” Final del string (o antes de ”\n” final)
”\z” 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. . .
12
Búsquedas y reemplazos
m/(\w+) \1/ # Palabras repetidas [1ex] ($h, $m, $s) = $hms =˜ m/(\d+):(\d+):(\d+)/; [1ex] m{ˆ(.∗): GIF}; # Ahora $1 es
[1ex] s<ˆ(?:foo|bar)([0−9]+)>[$1−baz−$1] [1ex] s/(\[0−9\]+)/$1 + 3/ge
3.7.
Subrutinas
Subrutinas
# ! / 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
# ! / 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
La definición general de subrutina tiene la forma: [0.75ex] sub NAME(PROTO): ATTRS BLOCK [0.75ex]
El prototipo y los atributos son opcionales.
Si no hay bloque, es declaración únicamente.
Si no se da nombre, es anónima.
Subrutinas – definición general
Escalar
$
@
Arreglo
\@
Referencia a arreglo
\%
Referencia a hash
&
Bloque
∗
Glob
\[$@] Escalar o arreglo
\ %;$ Referencia a hash, escalar opcional
Subrutinas – definición general
Mecanismo para limitar acceso o dar información sobre la subrutina. Básicamente definido por el usuario.
13
3.8.
Estructuras de datos y referencias
Múltiples dimensiones
En Perl es posible escribir por ejemplo: [1ex] $a [3][4] = $b{’Lu’}[2]{ ’ C−201’} [1ex] 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 [0.7ex] $a = \$x; $b = \@y; $c = \ %h; [0.7ex] y después
usarla descaradamente [0.7ex] ${$a} = 37; push @{$b}, (1, 2, 3); ${$c}{’Lu’} .= ” , FIS”; [0.7ex] desmanes
que son aplicables también a rutinas [0.7ex] sub una fun; $f = \&una fun; &{$f}(1, 2, 3); [0.7ex] 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: [0.7ex] $a[0] = [1, 2, $x, @y];
[0.5ex] $a[1] = {’uno’ => 1, ’dos’ => 2}; # Hash [0.5ex] $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 ” ;
4.
4.1.
Orientación a objetos en Perl
Paquetes
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 ” ;
4.2.
Módulos
Módulos
14
# Arr
# ! / 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
# 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;
4.3.
Objetos
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
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.
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
15
Crear objetos
La función bless asocia una referencia con un paquete:
$obj = {};
# 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
# 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
# ! / 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 ” ;
16
Descargar