so 7508 1
PERL
CLASE 2
so 7508 2
PERLRepaso clase anterior:
Ejemplo#!/bin/perlprint "Hola Mundo\n"; # Imprime Hola MundoTipos de datos
Escalares $x=0.897;$var=”Hola”;Arreglos @mezcla=("hola",23,"adios", 31.234);Hash %cuota=("root",1000,"Juan",256,"Jose",4000);
Como se referencia cada tipo de datosprint $var # Variable escalarprint $mezcla[0] # Elemento de un arrayprint $cuota{root} # Elemento de un hash
so 7508 3
PERLRepaso clase anterior:
Estructuras de Control
if (expresión) { instrucción o bloque de intrucciones 1;}[else { instrucción o bloque de instrucciones 2;}
While/until (expresión) {instrucción o bloque de instrucciones; }
for (inicial_exp; test_exp; incremento_exp) { instrucción o bloque de intrucciones;}
foreach $variable (@lista) { instrucción o bloque de instrucciones;}
so 7508 4
PERL
Repaso clase anterior:
# Ej1#!/usr/local/bin/perl$value = 0;while ($value++ <= 5) { print("\$value ahora $value\n");}
so 7508 5
PERLRepaso clase anterior:Ej Post
$value en el test Resultado $value despues del test
0 true (0 <= 5) 1
1 true (1 <= 5) 2
2 true (2 <= 5) 3
3 true (3 <= 5) 4
4 true (4 <= 5) 5
5 true (5 <= 5) 6
6 false (6 <= 5) 7 (exit while)
so 7508 6
PERLEjercicio, concatenar los textos ingresados por STDIN:
# Ej3#!/usr/bin/perl$resultstring = "";print("Ingrese el texto - (linea en blanco para salir)\n");$input = <STDIN>;chop ($input);while ($input ne "") { $resultstring .= $input; $input = <STDIN>; chop ($input);}print ("Cadena final:\n");print ("$resultstring\n");
so 7508 7
PERLRepaso clase anterior:
#!/usr/bin/perl@list = (1, 2, 3, 4, 5);foreach $temp (@list) { if ($temp == 2) { $temp = 20; }}
Despues
@list=(1,20,3,4,5)
so 7508 8
PERLEntradas y Salidas
Para leer de teclado se utiliza <STDIN>, que es un manejador de ficheros (Filehandle), que por costumbre se ponen en mayúsculas.
También existe <STDOUT> y <STDERR> para la sálida estándar y la sálida de errores respectivamente.
Lectura de STDIN:#!/usr/bin/perlprint "Hola. ¿Cómo te llamas?\n";$nombre=<STDIN>;chop($nombre);if ($nombre eq ""){print 'Ingresa tu nombre'."\n";}
else{print "Hola $nombre!\n";};
so 7508 9
PERL
Entradas y Salidas
En el ejemplo anterior el script de Perl espera a que el usuario pulse Return (retorno de carro), es decir, lee una línea ($nombre=<STDIN>).
Si en lugar de una variable escalar hubiera utilizado un array, el script hubiese guardado también los retornos de carro hasta que se hubiese pulsado CTRL+D (@vector=<STDIN>).
Para escribir en la salida estándar se utiliza print como hemos visto, pero si queremos escribir en la salida de errores sería poniendo después de print el manejador de fichero de donde queremos escribir.
so 7508 10
PERLEntradas y Salidas
Para trabajar con un archivo hay que abrirlo, escribir/leer de él y cerrarlo.Para abrir un fichero se utiliza la función open y para cerrarlo con close.El formato para abrir un fichero es :
open (Manejador_de_fichero, Modo_y_NombreFichero).
Lo modos de abrir un fichero se muestran en la siguiente tabla.
Archivo Abre Archivo para lectura<Archivo Abre Archivo para lectura>Archivo Abre Archivo para estritura, lo crea si no exixte>>Archivo Abre Archivo para appendear+>Archivo Abre Archivo para Lectura Escritura
so 7508 11
PERLEntradas y Salidas
Ejemplo:#!/usr/bin/perl$entrada="entrada.txt";$salida ="salida.txt";open (ENTRADA,"<$entrada") || die "ERROR: No puedo abrir el fichero $entrada\n";open (SALIDA,">$salida") || die "ERROR: No puedo abrir el fichero $salida\n";while ($linea=<ENTRADA>){print SALIDA $linea;}close (ENTRADA);close (SALIDA);
so 7508 12
PERLEjemplo:
#!/usr/bin/perl$ar=$ARGV[0];$str=$ARGV[1];open(AR,"gunzip -c $ar |") || die "No se puede abrir el archivo $ar $!\n";open(SAL,"| grep $str ") || die "No se puede abrir el archivo $ar $!\n";@indice=<AR>;close(AR);foreach $f (@indice) {print SAL $f ;}close(SAL);
so 7508 13
PERLLectura de directorios
opendir(manejador,directorio) (Devuelve verdadero si puede abrir el directorio)
readdir(manejador) (Dependiendo del contexto devuelve una lista o el siguiente archivo).
closedir(manejador) (Devuelve verdadero si puede abrir el directorio)
so 7508 14
PERLLectura de directorios
Ejemplos#!/usr/bin/perl$dir=$ARGV[0];if (opendir(DIRH,"$dir")){@flist=readdir(DIRH);closedir(DIRH);}foreach (@flist){# ignorar . y .. :next if ($_ eq "." || $_ eq "..");if ( -x "$dir/$_" ){print "$dir/$_\n";}}
so 7508 15
PERLLectura de directorios
Ejemplos#!/usr/bin/perl $dirname = "./";opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";while( $filename = readdir(DIR)){
if (-r $filename){
print("Tiene permiso de lectura $filename\n");}
}closedir(DIR);
so 7508 16
PERL
File Test Operator
Operator Description-d Is name a directory?-f Is name an ordinary file?-l Is name a symbolic link?-o Is name owned by the user?-r Is name a readable file?-w Is name a writable file?-x Is name an executable file?-z Is name an empty file?
so 7508 17
PERLOperador diamante
Este operador toma diferentes comportamientos según el contexto.
- Pasandole un manejadorwhile ($linea=<ENTRADA>)# Lee los registros del manejador ENTRADA{print SALIDA $linea;}
- Pasandole un * while ( <*> ){print "$_\n";} # Devuelve nombres de archivos del directoriowhile ( <*.pl> ){print "$_\n";} # Devuelve nombres de archivos con extension pl.
so 7508 18
PERL
Operador diamante
- Sin parametroEl operador diamante tratará de leer @ARGV si no tiene elementos lee de la entrada standard.
While ( <> )# Lee de entrada standard{print "$_\n";} # Espera de entrada standard y la imprime.
While ( <> )# Lee de @ARGV{print "$_\n";} sript.pl arch1 arch2 arch3# Muestra por salida las lineas de arch1, arch2 y arch3
so 7508 19
PERLOperador diamante
- Asignando a un arreglo@arreglo =<*> ; for ($i=0;$i<=$#arreglo;$i++){print "$arreglo[$i] \n";} # Recorre archivos del directorio.
open(MYFILE,”<pgm.pl”) || die “Error”;@array = <MYFILE>;# Asigna al arreglo todos los registros del archivo.foreach (@array){$i=index($_,"print",1); # busca el string “print”if ($i > 0){
print "$_\n"; };}
so 7508 20
PERLComo obtener la hora del sistema
localtimeContexto arrayDevuelve los siguientes elementos:-Segundos-Minutos-Hora-Día -Mes (0-11)-Año desde 1900-Día de la semana (Domingo = 0)-Numero de día del año desde 0.-Verdadero en el caso de que la fecha esté dentro del horario de verano
so 7508 21
PERL
Como obtener la hora del sistemaEjemplo:($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;$year+=1900;$mon++;print "anio=$year\nmes=$mon \ndia=$mday\nhora=$hour \nmin=$min \nsegundos= $sec \n";print "$mday/$mon/$year $hour:$min:$sec \n";
SALIDA:anio=2011mes=10 dia=3hora=11 min=30 segundos=30 3/10/2011 11:30:30
so 7508 22
PERL
Como obtener la hora del sistema
Contexto escalar$fecha=localtime;Print $fecha.”\n”;
SALIDASat Apr 7 19:49:46 2012
Como obtener usuarioLa función getlogin devuelve el user ID del usuario que esta logueado.
$logname = getlogin();print "El usuario es $logname \n";
so 7508 23
PERLLlamadas al sistema operativoPara pedir al sistema operativo que ejecute otros programas desde un programa en Perl podemos hacerlo de varias maneras. Al hacerlo estamos en realidad llamando al sistema operativo y esperando su respuesta:
Ejemplos:$resultado=`ls -l *.sh`;# muestra todos los archivos .sh del directorio actual.$resultado = `df -k`; # muestra el espacio libre en los sistemas de ficheros de tu sistema,$resultado = `cat archivo.pdb | grep ATOM`; # imprime las líneas 'ATOM' de un PDB
$resultado = system("cat archivo.pdb | grep ATOM");$resultado = system("pwd"); # directorio actual
so 7508 24
PERLSPLIT
La funcion split() divide una cadena de acuerdo a un patrón pasado como parámetro.
split(PATRÓN,CADENA);
Ejemplo$informacion = "Juan,Gomez,29";@data = split(",", $informacion);($nombre,$apellido,$edad) = split(",", $informacion);print "$nombre $edad $apellido \n";print $data[1] . "\n";
so 7508 25
PERLJOIN
La funcion join() permite unir diferentes partes en una sola, introduciendo un separador entre ellas, es decir, hace lo contrario de split.
join(STRING,LISTA);
Ejemplopush (@numeros,$i) while ($i++ <= 10);$cadena=join(",",@numeros);
$cadena=join("\n",@numeros);print $cadena . "\n";
so 7508 26
PERLExpresiones regulares
Las expresiones regurales son caracteres especiales que juntos o por separado actúan como patrones de búsqueda, comparación o sustitución en una cadena. Estas expresiones se colocan entre 2 barras (/expr/).
Caracteres especiales. cualquier carácter excepto \n^ Inicio de la linea$ fin de la lineaa* es una a cero o más veces.a+ es una a una o más veces.a? es una a una o ninguna veces.a{n} es una a n veces.a{n,} es una a n o más veces.a{n,m}es una a entre n y m veces, incluidos ambos valores.
so 7508 27
PERLExpresiones regulares
Caracteres especiales
\d es equivalente a [0-9].\s es equivalente a [\ \t\r\n\f] (espacio, tabulador y retornos de carro).\w es equivalente a [0-9a-zA-Z_].\D es el negado de \d; Representa cualquier caracter que no sea un digito [^0-9].\S es el negado de \s; Represnta cualquier cosa que no sea un espacio en blanco [^\s].\W es el negado de \w; Representa cualquier cosa que no sean cifras, letras o _ [^\w].\n newline.
so 7508 28
PERLExpresiones regulares
Expresiones regulares de comparación.
valor a comparar =~ patrón de búsqueda if ($linea =~ /html/) { print $linea; }
$string = "Mi frase no es muy larga";if($string =~ /frase/){print "Se encontró la palabra: frase.\n";}$string = "Mi frase no es muy larga";if($string !~ /jugo/){print "No se encontró la palabra: jugo.\n";}
so 7508 29
PERLExpresiones regulares
Expresiones regulares de comparación.
Ejemplos$cadena="Hola Mundo";
($cadena =~ /^Hola/) # que comience con Hola($cadena =~ /Mundo$/)# que termine con Mundo($cadena =~ /M*/) # que contenga 0 o mas M($cadena =~ /M?ndo/) # que contenga la cadena ndo
so 7508 30
PERLExpresiones regulares
Expresiones regulares de sustitución.
variable =~ s/patrón búsqueda/patrón sustitución/opciones $string = "Hoy es Lunes";$string =~ s/Lunes/Martes/;print $string ."\n"
$var="Hola Mundo";$var=~ s/o/a/g;print $var; # Imprime Hala Munda
$var=~ s/\s/-/g;print $var; # Imprime Hala-Munda
so 7508 31
PERLVariables especiales$_ Contiene el contenido del último registro leído. $0 Contiene el nombre del script perl.$$ Contiene el PID dscript perl.$. Contiene el número de la última línea leída.$/ Separador de campo para la entrada.$[ Contiene el valor del primer índice de una array (0)$] Contiene la version de perl ("perl -v").$< Uid real del proceso actual.$@ Contiene el mensaje de error de sintaxis de perl del último comando evaluado.$( Gid real del proceso actual.@ARGV Contiene los parámetros pasados a nuestro script %ENV: Array asociativo que contiene las variables de entorno bajo el que se ejecuta nuestro script Perl.(ej.$ENV{HOME})
so 7508 32
PERLEjemplos
#! /usr/bin/perl # localiza un programa que va a ejecutar
die "Uso: cual programa\n" if ($#ARGV < 0);$programa= $ARGV[0];@lpath= split(/:/, $ENV{PATH});
foreach $dir (@lpath) { next if ($dir =~ /^\.+$/); if (-x "$dir/$programa") { print "$dir/$programa\n"; }}
so 7508 33
PERLEjemplos
#! /usr/bin/perl # Busca archivos de tipo .pdf y muestra su tamaño
opendir(DIR,$ARGV[0]) || die "No se puede abrir el directorio \n";@indice= readdir(DIR) ;closedir(DIR);
foreach $f (@indice) { next unless ( $f =~ /\.pdf$/ ); system("wc $f"); `wc $f `;}
so 7508 34
PERLVer Ejemplo
EjHash1.plEjHash2.plEjVector.plEjClase2_part5.pl
so 7508 35
PERLEjemplos
print "Ingrese el hash \n";$hash=<STDIN>;chop($hash);@keys = keys (%$hash);@values = values (%$hash);print $keys[0];print $keys[1];print $keys[2];print $keys[3];print $keys[4];#while ($#keys >= 0) { print pop(@keys), '=', pop(@values), "\n";}#print "# Otra forma de recorrer un hash \n";while (($clave,$valor) = each %hash){ print "$clave \t==> $valor \n"; }## Funcion mapprint map "$_ = $hash{$_}\n", keys %hash;@p = map $_ ** 2, (1..10);
so 7508 36
PERLEjemplos
print "Ingresar clave del hash a validar \n";$clave=<STDIN>;chop($clave);if ( exists($hash{$clave} )) {print "La clave $clave existe en el hash \n"}else {print "La clave $clave NO existe en el hash \n"};#print "Se borra la clave ingresada\n";delete($hash{$clave} );if ( exists($hash{$clave} )) {print "La clave $clave NO ha sido borrada\n"}else {print "La clave $clave ha sido borrada\n"};#
so 7508 37
PERLEjemplos#!/usr/bin/perl$searchword = $ARGV[0];print ("Palabra a buscar: $searchword\n");shift (@ARGV);$totalwordcount = $wordcount = 0;$filename = $ARGV[0];print ("Nombre de archivo: $filename\n");while ($line = <>) { chop ($line); @words = split(/ /, $line); $w = 1; while ($w <= @words) { if ($words[$w-1] eq $searchword) { $wordcount += 1; } $w++; } if (eof) { print ("Ocurrencias en el archivo $filename: "); print ("$wordcount\n"); $totalwordcount += $wordcount; $wordcount = 0;$filename = $ARGV[0]; }}print ("Total de ocurrencias: $totalwordcount\n")
so 7508 38
PERLEjercicio
Tenemos un archivo con facturas de las diferentes sucursales con el siguiente formato
Archivo Facturas:nro de factura, fecha,sucursal, importe
Utilizando hashes imprimir total facturado por sucursal
so 7508 39
PERLopen (ENT,"<facturas.txt") || die "ERROR: No puedo abrir el fichero facturas\n";open (SAL,">sucursales.txt")|| die "ERROR: No puedo abrir el fichero sucursales\n";while (<ENT>) {chomp($_);@reg=split(”,”,$_);$suc{$reg[2]}+=$reg[3];}open (SAL,">sucursales.txt");foreach (keys(%suc)){print SAL $_.",".$suc{$_} ."\n";};close (SAL);close (ENT);