Escolar Documentos
Profissional Documentos
Cultura Documentos
CLASE 1
so 7508
PERL
PERL - Practical Extraction and Report Language
Es un lenguaje pensado para la manipulacin de cadenas de caracteres,
archivos y procesos.
Fue diseado para asistir a usuarios UNIX en tareas que probablemente
sean muy pesadas para el shell u otras herramientas del entorno UNIX.
Es un lenguaje intermedio entre los shell scripts y la programacin en C.
Es un lenguaje no precompilado, pero an as es ms rpido que la
mayora de lenguajes interpretados, en especial que el Bourne Shell.
Esto se debe a que los programas en Perl son analizados, interpretados
y compilados por el interprete perl antes de su ejecucin.
so 7508
PERL
Historia de PERL
PERL
Tres Virtudes del Programador segun Larry Wall:
PERL
Perl es ideal para producir soluciones rpidas a problemas
pequeos, o para crear prototipos para testear soluciones
potenciales a grandes problemas.
Perl provee todas las ventajas del sed y awk. Perl tambien soporta
un sed-to-Perl translator y un awk-to-Perl translator.
Una vez que escribimos el cdigo en Perl, podemos usarlo
rpidamente en las mas variadas maquinas: practicamente en todas
las UNIX, Windows NT, Windows 95, Macintosh, VMS, OS/2,
MS/DOS.
En resumen, Perl es tan poderoso como el C pero tan conveniente
como awk, sed, and shell scripts.
so 7508
PERL
Un programa Perl es un conjunto de sentencias y definiciones
dentro de un archivo.
Ese archivo se hace ejecutable cambiando los permisos via
chmod +x filename.
Es el mismo concepto que tenemos de un shell script (secuencia
de comandos shell puestos en un archivo de texto).
Habitualmente se utiliza la extension pl (ejemplo.pl) .
so 7508
PERL
Ejemplo
#!/bin/perl
print "Hola Mundo\n";
Como se puede deducir, con la primera lnea indicamos donde est el
intrprete de Perl, despus de #!.
Esto no hara falta si, al ejecutar el script, lo hacemos usando el
intrprete.
Por ejemplo: /usr/bin/perl hola.pl
Para separar las instrucciones, como en la mayora de los lenguajes de
programacin se utiliza el punto y coma (;) y los comentarios son
precedidos por #.
so 7508
PERL
Ejemplo
#!/bin/perl
$inputline = <STDIN>;
Cuando el intrprete de Perl analiza la sentencia, la divide en unidades
ms pequeas de informacin.
En este ejemplo, las unidades ms pequeas de informacin son
$inputline, =, <STDIN>, y ;.
Cada una de estas unidades ms pequeas de informacin se denomina
un token.
Los token pueden estar separados por varios blancos. La idea de la
utilizacin de los mismos es hacer legible el programa Perl.
so 7508
PERL
Tipos de Datos
Escalares:
Las variables contengan un $ representan un escalar.
$x
$y
$n
$i
=
=
=
=
0.897;
6.23e-24;
567;
-234;
#
#
#
#
un
un
un
un
real
real
entero
entero
so 7508
PERL
Ejemplo
#!/usr/local/bin/perl
print ("Ingrese la distancia a convertir:\n");
$originaldist = <STDIN>;
chop ($originaldist);
$miles = $originaldist * 0.6214;
$kilometers = $originaldist * 1.609;
print ($originaldist, " kilometros = ", $miles,
" miles\n");
print ($originaldist, " millas = ", $kilometers,
" kilometers\n");
so 7508
10
PERL
Declaracin incorrectas de variables escalares:
variable
$
$47x
$_var
$variable!
$new.var
#
#
#
#
#
#
debe tener un $
debe tener por lo menos una letra
el segundo caracter debe ser una letra
dem caso anterior
no puede contener un !
no puede contener un .
Los valores enteros no pueden empezar por cero porque esto permite
especificar un entero mediante su codificacin octal o hexadecimal.
El cdigo octal se antecede con en cero 0; el cdigo hexadecimal se antecede
con un 0x.
Por ejemplo:
$x = 0377;
$y = 0xff;
# equivale a 255
# equivale a 255
so 7508
11
PERL
Las cadenas de caracteres se especifican literalmente por medio de un
sucesin de caracteres delimitada por comillas dobles ("..") o simples
('..').
Cuando van delimitadas por comillas (".."), toda variable referenciada en
el interior de la cadena se evala y se reemplaza por su valor, adems
interpreta los caracterer \ (\n newline, \t tab, \b backspace).
Por ejemplo, las instrucciones siguientes:
$wld = "mundo";
$str = "Hola $wld!";print $str ==> Hola mundo!
$str = 'Hola $wld!';print $str ==> Hola $wld !
12
PERL
Ejemplo
print ("Enter a line of input:\n");
$inputline = <STDIN>;
print ("uppercase: \U$inputline\E\n");
print ("lowercase: \L$inputline\E\n");
print ("as a sentence: \L\u$inputline\E\n");
Enter a line of input:
tHis Is My INpUT LiNE.
uppercase: THIS IS MY INPUT LINE.
lowercase: this is my input line.
as a sentence: This is my input line.
so 7508
13
PERL
Operadores de variables escalares :
+ suma,
- resta,
* multiplicacin,
/ divisin
(Ej: print "2+5*2+15/3\n"; ==> $var = 17)
concatenacin
(Ej: $var1=Hola;$var2=Mundo;
print $var1.$var2."\n"; ==> HolaMundo
repeticion.
(Ej: $var1=Hola;print $var1 x 3 . "\n"; ==>HolaHolaHola)
so 7508
14
PERL
Operadores de asignacin:
=
+=
-=
*=
/=
x=
.=
asignacin solamente
suma y asignacin
resta y asignacin
producto y asignacin
divisin y asignacin
repeticin y asignacin
concatenacin y asignacin
Operador autoincremental :
++variable
pre
$var1=1;
print ++$var1; ==>2
print $var1
==>2
(Ej: $var=2;)
(Ej: $a+=2; #$a=$a+2;)
(Ej: $a-=2; #$a=$a-2;)
(Ej: $a*=3; #$a=$a*3;)
(Ej: $a/=3; #$a=$a/3;)
(Ej: $b x=3; #$b=$b x 3)
(Ej:$b .="33"; #$b=$b."33")
variable++
post
$var1=1;
print $var1++. "\n"; ==>1
print $var1
==>2
so 7508
15
PERL
El tipo y el valor de las variables en Perl se determina a partir del contexto.
As, una cadena de caracteres conteniendo un valor numrico ser convertida
en variable numrica en un contexto numrico.
Ejemplo:
$x = 4.1;
$y = "11";
$z = $x + $y;
$t = $x . $y;
#
#
#
#
un real
una cadena de caracteres
adicin de dos valores numricos 15.1
concatenacin de dos cadenas 4.111
$resultado = "hola" * 5;
# Asigna 0 a $resultado, ya que "hola" se convierte en 0
$resultado = "12O34" 4;
# Asigna 8 a $resultado, ya que
nmero entero 12;
so 7508
12O34 se convierte en el
16
PERL
En Perl podemos interpolar variables dentro de otra:
$animal="Gato $color de $edad aos";
La interpolacin de variables puede evitarse anteponiendo la contrabarra (\) o
delimitando la cadena con apstrofes.
Ejemplo:
$adr =
$msg =
$msg =
$msg =
"www";
"La direccion es $adr.fi.uba.ar"; print $msg. "\n";
"La direccion es \$adr.fi.uba.ar"; print $msg. "\n";
'La direccion es $adr.fi.uba.ar'; print $msg. "\n";
so 7508
17
PERL
Ej. Concatenacion
$a="Hola";
$b="Chau";
$c=$a.$b;
$d="$a$b";
$e="$a.$b";
print '1- $a.$b'." ==> $c\n";
print '2- "$a$b"'. " ==> $d\n";
print '3- "$a.$b"'." ==> $e\n";
1- $a.$b
==> HolaChau
2- "$a$b" ==> HolaChau
3- "$a.$b" ==> Hola.Chau
so 7508
18
PERL
Comandos chop() y chomp()
La funcin chomp() remueve el carcter de newline desde el final de una
cadena.
La funcin elimina cualquier carcter que coincide con el valor actual de $/
(input record separator) cuyo valor default es newline.
Ej.
$text = <STDIN>;
chomp($text);
print "Usted Ingreso '$text'\n";
La funcin chop() elimina el ltimo carcter de una cadena independientemente
de que sea este.
Ej.
$string = 'frog';
$chr = chop($string);
print "String: $string\n";
==> String: fro
print "Char: $chr\n";
==> Char: g
so 7508
19
PERL
Funciones con string
index(CADENA,SUBCADENA,POSICIN);
Retorna la posicin de la primera ocurrencia de SUBCADENA dentro de
la CADENA iniciando en POSICIN. Si no se informa POSICIN la
bsqueda inicia al principio de la CADENA, (POSICION de 0 a n).
Por ejemplo:
$string = "perlmeme.org";
print index($string,"e",2);
print index($string,"L");
so 7508
#Imprime 5
#Imprime -1
20
PERL
Funciones con string
substr(CADENA,DESPLAZAMIENTO,LONGITUD);
Retorna una porcin de la cadena entre DESPLAZAMIENTO y
LONGITUD. Si no se especfica una LONGITUD se va al final de la
CADENA. Se puede poner un DESPLAZAMIENTO negativo para iniciar
a la derecha de la CADENA.
Por ejemplo:
so 7508
21
PERL
Funciones con string
length(CADENA);
Retorna la longitud de la CADENA. Por ejemplo:
$string = "programa";
print length($string); #Imprime 8
lc(CADENA);
Retorna la CADENA convertida en minsculas. Por ejemplo:
$string = "PROGRAMA";
print lc($string); #Imprime programa
uc(CADENA);
Retorna la CADENA convertida en maysculas. Por ejemplo:
$string = "programa";
print uc($string); #Imprime PROGRAMA
so 7508
22
PERL
Arreglos
23
PERL
Ejemplos arreglos:
@num1 = @numeros[1..3];
@str = @letras[0,2];
($ristra, $num)= @mezcla;
$long = @arreglo
#
#
#
#
@a=(1,2,3);@b=(5,6,7);
@c=(@a,4,@b,8); # (1,2,3,4,5,6,7,8)
@ordenada = sort(@arreglo)
@arreglo2 = reverse(@arreglo) # de atrs para adelante
so 7508
24
PERL
Comandos para arreglos:
Para sacar/insertar elementos se pueden usar las funciones pop y
push, que sacan o insertan, respectivamente, un elemento al final, es
decir, tratan el array como una pila.
Tambin podemos utilizar shift y unshift para sacar o insertar,
respectivamente, un elemento del principio del array.
Para ver la ltima posicin del array $#array.
Ej.print "El ltimo es ".$arreglo[$#arreglo]."\n";
so 7508
25
PERL
Ejemplos comandos para arreglos:
# Asignamos unos cuatro valores al array
@matriz=(1,"dos",3,"cuatro");
# Aadimos con Push
push(@matriz, 5, 6, "siete");
# Mostramos el ltimo elemento
print "El ltimo es ".$matriz[$#matriz]."\n";
# Imprime: El ltimo es siete
# Sacamos con Pop
$uno=pop(@matriz);
print "He sacado $uno\n";
# Imprime: He sacado siete
so 7508
26
PERL
Ejemplos comandos para arreglos:
# Aadimos con unshift
unshift(@matriz, "cero" );
# Mostramos el primer elemento
print "El primero es ". $matriz[0]."\n";
# Imprime: El primero es cero
# Sacamos con shift
$uno=shift(@matriz);
print "He sacado $uno\n";
# Imprime: He sacado cero
print "La matriz tiene ".($#matriz + 1)." elementos\n";
# Imprime: La matriz tiene 6 elementos
so 7508
27
PERL
Ejemplos comandos para arreglos:
#!/usr/local/bin/perl
($file1, $file2) = @ARGV;
print El primer archivo pasado como parmetro es: $file1\n
El segundo es : $file2\n;
print El primer tercer parametro es: $ARGV[2]\n;
so 7508
28
PERL
Hashes (listas asociativas)
Una lista asociativa est indexada por cadenas en lugar de por nmeros.
Se utiliza % para definir el tipo de lista asociativa y un elemento est
indexado por el anterior formando ambos parejas del tipo (clave, valor).
%cuota = ("root", 1000, "Juan", 256, "Jose", 4000);
%fruit = (apples => 3,oranges => 6);
print $cuota{root} ." ". $fruit{oranges}."\n"; # 1000 6
so 7508
29
PERL
En cuanto al nombre de las variables estn permitidos las letras, dgitos
y el carcter underscore (_).
Las letras maysculas y minsculas son diferenciadas en los nombres
de variables. Los nombre de las variables siempre deben comenzar por
una letra.
Funciones:
defined(VARIABLE). ej.
delete(KEY).
ej.
exists(KEY).
ej.
values(HASH).
ej.
keys(HASH).
ej.
30
PERL
Estructuras de Control
if (expresin) {
instruccin o bloque de intrucciones 1;
}
[else {
instruccin o bloque de instrucciones 2;
}
Ejemplo:
if ($i==5)
{
print 'La variable $i es 5'."\n";
}
else
{
print 'La variable $i no es 5'."\n";
}
so 7508
31
PERL
Operadores de Comparacin
Numeric
>
>=
<
<=
==
!=
<=>
String
gt
ge
lt
le
eq
ne
cmp
Meaning
Greater than
Greater than or equal to
Less than
Less than or equal to
Equal to
Not equal to
Comparison, with signed result
so 7508
32
PERL
while (expresin) {
instruccin o bloque de instrucciones;
}
Ejemplo:
print "Teclea \"x\" para salir:\n";
$cadena = "";
while ($cadena ne "x") {
$cadena = <STDIN> ;
chop($cadena);
print "Has escrito $cadena\n";
}
print "Salida.\n"
so 7508
33
PERL
until (expresin) {
instruccin o bloque de instrucciones;
}
Ejemplo:
until( $a > 10 ){
print "Value of a: $a\n";
$a = $a + 1;
}
so 7508
34
PERL
do {
instruccin o bloque de instrucciones;
} [while | until] (expresin);
Ejemplo:
do {
$stops++;print "Next stop? ";
chomp($location = <STDIN>);
} until $stops > 5 || $location eq 'home';
do {
print "Password: ";
chomp($psw = );
} while ++$count < 3 && $psw ne "1qaz";
La condicin se evala al final del loop.
so 7508
35
PERL
Si el bloque de instrucciones dentro de la sentencia condicional
(ej.if) consta de una sola declaracin, Perl le permite escribir sto
utilizando una sentencia condicional de una sola lnea.
Sintaxis
statement keyword condexpr
print
print
print
print
("This is zero.\n")
("This is zero.\n")
("Not zero yet.\n")
("Not zero yet.\n")
if ($var == 0);
unless ($var != 0);
while ($var-- > 0);
until ($var-- == 0);
so 7508
36
PERL
for (inicial_exp; test_exp; incremento_exp) {
instruccin o bloque de intrucciones;
}
Ejemplo:
print "10 Iteraciones\n";
for ($i=0; $i<10; $i++) {
print "Interacin nmero $i\n";
}
@lista = ("elem1", "elem2", "elem3", "elem4");
for ($i = 0; $i<= $#lista; $i++) {
print $lista[$i], "\n";
so 7508
37
PERL
foreach $variable (@lista) {
instruccin o bloque de instrucciones;
}
Ejemplo:
%dias=("lunes",L,"martes",M,"miercoles",X,"jueves",J,"
viernes",V,"sabado",S,"domingo",D);
foreach $clave (keys(%dias))
{
print "\%dias{".$clave."}=".$dias{$clave}."\n";
}
so 7508
38
PERL
La instruccin last interrumpe la ejecucin del bucle actual y se ejecuta
la instruccin que sigue al bloque.
El ejemplo siguiente permite interrumpir el bucle while cuando la variable
i toma el valor 3.
$i = 0;
while($i < 6) {
if($i == 3) {
last;
}
$i++;
}
print "el valor de \$i es $i";
so 7508
39
PERL
La instruccin next es idntica a la instruccin continue en C. Interrumpe
la ejecucin del bloque de instruccin actual y prosigue la ejecucin en
la iteracin siguiente. Si el resultado de la expresin es vlido, el bucle
se ejecuta de nuevo.
print "Teclea \"x\" para salir:\n";
print "Si se pulsa la tecla \"s\" no se imprime:\n";
$cadena= "";
while ($cadena ne "x") {
$cadena=<STDIN>;
chop($cadena);
if ($cadena eq "s") {
next;
}
print "Has escrito $cadena\n";
}
print "Salida.\n"
so 7508
40
PERL
Ejercicio
Cargar un vector con 10 elementos y calcular el promedio de los
valores almacenados. Determinar adems cuntos son mayores
del promedio, imprimir el promedio, el nmero de datos mayores
que el promedio.
so 7508
41
PERL
#!/usr/bin/perl
# VERSION 1
print "Ingrese 10 Valores Cualquiera \n";
#
for ( $i = 0; $i < 10; $i++ ) {
$numero = <STDIN>;chop($numero);
$numero[$i] = $numero;
$suma = $suma + $numero[$i];
}
#
print "Los Nmeros agregados son $i \n";
#
$promedio = $suma / $i;
print "EL Promedio de los Numeros son $promedio \n";
#
print "Los numeros mayores que promedio son: \n";
for ( $i = 0; $i < 10; $i++ ) {
if ( $numero[$i] > $promedio ) {
print "$numero[$i]\n";
}
}
so 7508
42
PERL
#!/usr/bin/perl
# VERSION 2
print "Ingrese los Valores Cualquiera, \"n\" para terminar \n";
#
while ($numero ne "n") {
$numero = <STDIN>;chop($numero);
$numero[$i] = $numero;
$suma = $suma + $numero[$i];$i++;
}
$cant=$#numero;
print "Los Nmeros agregados son $cant \n";
#
$promedio = $suma / $cant;
print "EL Promedio de los Numeros son $promedio \n";
#
print "Los numeros mayores que promedio son: \n";
for ( $i = 0; $i < 10; $i++ ) {
if ( $numero[$i] > $promedio ) {
print "$numero[$i]\n";
}
}
so 7508
43
PERL
#!/usr/bin/perl
# VERSION 3
print "Ingrese los Valores Cualquiera, \"n\" para terminar \n";
#
while (<STDIN>) {
$numero = $_;chop($numero);
$numero[$i] = $numero;
$suma = $suma + $numero[$i];$i++;
}
$cant=@numero;
print "Los Nmeros agregados son $cant \n";
#
$promedio = $suma / $cant;
print "EL Promedio de los Numeros son $promedio \n";
#
print "Los numeros mayores que promedio son: \n";
for ( $i = 0; $i < 10; $i++ ) {
if ( $numero[$i] > $promedio ) {
print "$numero[$i]\n";
}
}
so 7508
44