Manual de PERL by ekc11009

VIEWS: 27 PAGES: 18

									                                 Manual de PERL
http://www.etsimo.uniovi.es/perl/tutor/
http://epq.com.co/~cjara/perl/tutorial.html
http://www.geocities.com/SiliconValley/Station/8266/perl/

Perl (Practical Extraction and Report Language) es un lenguaje desarrollado por Larry
Wall (lwall@netlabs.com) se especializa en procesar archivos de texto muy fácilmente.

Todas las líneas deben terminar en punto y coma (;)

Encabezado CGI

#!/usr/bin/perl

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

Esto se usa cuando el método en la forma es “POST”

Generando las Páginas HTML
print "Content-type: text/html\n";
print "<html>\n";
print "<head>\n";
print "<title>Prueba</title>\n";
print "</head>\n";
print “<body>\n”;
print “contenido del \“campo1\” de la forma: $FORM{'campo1'} \n”;
print “</body>\n”;
print “</html>\n”;

los símbolos como @ o “ o cualquier otro símbolo raro que se quieran imprimir deben ir
precedidos por \ como esta puesto en el ejemplo anterior con campo1.

EL LENGUAJE PERL

Operadores
+    suma                                        % modulo (residuo de una división)
-    Resta                                       ** Potencia
.    concatenación                               * multiplicación
++   incremento
x(n) repetición ejemplo $A=”p”x(3)             $A=”ppp”
use Math::Complex;           ---->   Raíz Cuadrada
print sqrt(-2);

Operadores de comparación
Numéricos                Strings
==                       Eq                                 Igual
!=                       Ne                                 No es igual
<                        Lt                                 Menor que
>                        Gt                                 Mayor que
<=                       Le                                 Menor o igual que
>=                       Ge                                 Mayor o igual que

Operadores Lógicos

And (&&), or (||)

Variables Escalares

Toda variable debe comenzar con el signo $ seguido del nombre de la variable y
pueden contener datos del tipo numéricos y alfanuméricos (datos de tipo escalar) la
forma de asignar datos es con el signo de = los nombres de las variables es sensible a
minúsculas y mayúsculas o sea no es lo mismo $A que $a a continuación se muestra un
ejemplo:


$animal="Gato";                      $Octal=033;
$crias= 3;                           $Hex=0x19;
$edad= 1.5;                          Asignar múltiples valores a múltiples variables:
$notacion=1.2E10;                    ($a,$b,$c) = (“Dato1”,8,”Dato2”);

Se puede juntar dos o más variables utilizando el . o el signo + el punto indica
concatenar y el más indica la operación de suma, veamos un ejemplo:

$A="12"; $B=3;
$C=$A + $B     sería igual a $C=15
$C=$A . $B     sería igual a $C=”123”


se puede asignar datos a variables con datos de otras variables ejemplo:
$color=”negro”;
$edad=3;

$animal="Gato $color de $edad años";

Sería igual que $animal="Gato negro de 3 años".


Arreglos
Los arreglos comienzan con el signo @ (arroba) la numeración de las posiciones
comienza en la posición cero (0) y este valor se coloca entre corchetes [ ], ejemplo:


Se puede ingresar datos al vector de las siguientes formas:

@vector=("gato","perro","vaca");

$vector[0]= "gato";
$vector[1]= "perro";
$vector[2]= "vaca";

se puede hacer referencia a valores dentro del vector de la siguiente forma:

$animal[1] equivale al valor de $animal[1]
$animal[1..2] equivale a los valores de $animal[1] y $animal[2]
$animal[1,2] equivale a los valores de $animal[1] y $animal[2]

La notación $#animal dará como resultado el número de datos en el vector menos uno
ya que se numera desde la posición cero ejemplo:

@animal = ("ratón" ,"perro" ,"vaca" ,"gorrión" ,"paloma" ,"halcón");

$#animal sería igual a 5.

Arreglos tipo hashes
Comienzan con el signo % y se tratan de arreglos cuyo índice es un valor que puede ser
numérico o alfanumérico. Ejemplo:

%dia=(Lun,"Lunes",Mar,"Martes",Mie,"Miércoles",Jue,"Jueves",Vie,"Viernes");

$dia{lun}=”lunes”;
$dia{mar}=”martes”;
$dia{mie}=”miercoles”;
$dia{jue}=”jueves”;
$dia{vie}=”viernes”;

el primer dato del par es la clave o llave el segundo es el valor que se le asigna. Para
mostrar el valor de alguna posición se pone:

print $dia{lun}; lo que dará como resultado “Lunes”. Note que la posición se da con el
valor encerrado entre llaves y no corchetes.
Estructuras de Control

if,elsif,else (estructura condicional)

if ( $a < 18 )
{
print "Tu eres menor de edad\n";
}
else
{
print "Eres un adulto\n";
}

************

if ( $a == 0 )
{
$ind++;
print "Incorrecto\n";
}

************
if ( .... )
{
   ......;
   ......;
}
elsif ( .... )
{
   ......;
   ......;
}

While y until

La forma del while es :                       La forma del until es :

while ( condicion ) {                         do {
....;                                         ....;
....;                                         ....;
}                                             } until ( condicion )

For

La forma general del for es :

for ( exp_inicial; exp_testeo; exp_increm){
...;
...;
}
for ( $x=0;$x<10;$x++)
     {
     print "Llevas $x puntos\n";
     }


Foreach

El foreach de Perl es muy similar al de C-shell , recibe una lista de valores y asigna cada
uno de los valores de la lista a una variable de lectura . La estructura del foreach es :

foreach $a ( @alguna_lista ) {
...;
...;
...;
}

@a = (3,5,7,9);               %nombres=("J","Juan","A","Antonio","L","Luis");
foreach $x (@a)               foreach $letra (keys %nombres)
{                             {
    $y=$x*3;                   print "$letra\n";
    print "$y\n";             }
 }

Imprime 9,15,21,27 .          Imprime J, A, L

%nombres=("J","Juan","A","Antonio","L","Luis");

foreach $nombre (values %nombres)
{
 print "$nombre\n";
}

imprime Juan, Antonio, Luis


EXPRESIONES REGULARES Y PATRONES DE BUSQUEDA

Una de las características más potente y usada en PERL es la manipulación de cadenas.
Para ello existen una una gran variedad de expresiones y patrones que nos facilitan esta
tarea. Para estas expresiones se usan una serie de caracteres especiales que juntos o por
separado actúan como patrones de busqueda, comparación o sustitución en una cadena.
Estas expresiones se colocan entre 2 barras "/", así: /Hola/ y algunos caracteres con un
significado especial que actual como patrones de busqueda, como: ^,*,$,?,etc...

Nota: Ya que "/" se usa como delimitador de expresiones regulares, si queremos buscar
algún caracter como éste se escribe así: "\/", es decir, anteponiendo el signo de caracter
de control "\".
BUSQUEDAS
Teniendo una cadena como "Hola Mundo", queremos comprobar si dentro de ella se
encuentra la palabra "Hola".

Buscamos una palabra en la cadena

$cadena="Hola Mundo";              La situación contraria sería:

if($cadena =~/Hola/)               $cadena="Hola Mundo";
   {
   print "Si existe";              if($cadena !~/Planeta/) {
  }                                print "No existe";
                                   }

no importa si lo que se busca esta en minúsculas o mayúsculas

Buscamos la palabra "Hola" SOLO al principio de la cadena (^).

$cadena="Hola Mundo";

if($cadena =~ /^Hola/)
 {
  print "Existe";
 }

Buscamos la palabra "Mundo" SOLO al final de la cadena ($).

$cadena="Hola Mundo";

if($cadena =~ /$Mundo/)
   {
   print "Existe";
  }


Una combinación de SOLO ambos metacaracteres ^$ significa línea en blanco.

$cadena="Hola Mundo";

if($cadena =~ /^$/)
   {
   print ";
  }

# Podríamos traducirlo como Si "Hola Mundo" contiene ninguna palabra.
Buscamos una palabra que empieza por "M" (*).

$cadena="Hola Mundo";

if($cadena =~ /M*/)              if($cadena =~ /M+/)
 {                               {
   print "Existe";                print "Existe";
  }                              }


Buscamos cualquier caracter (? o .) en una cadena.

$cadena="Hola Mundo";

if($cadena =~ /M?ndo/)
 {
  print "Existe";
 }

# Si "Hola Mundo" contiene palabras como "Mundo","Mendo",Mondo", etc....


Buscar una cadena dentro de otra o sola; usando \b y\B

$cadena="El oso es perezoso";

if($cadena =~ /\boso/)
 {
  print "Palabra suelta: oso";
 }

if($cadena =~ /\Boso/)
 {
  print "Forma parte de una palabra: perezoso ";
 }

Podemos hacer una busqueda doble o alternativa ( |), es decir, buscar una cadena u
otra.

$cadena="El oso y el tigre están durmiendo";

if($cadena =~ /oso|tigre/)
 {
  print "Existen";
 }
Uso de la variable $_

En ocasiones es preferible usar una variable implícita $_ para realizar las busquedas,
de este modo no es necesario incluir la variable en la comparación.

$_="Hola Mundo";

if( /Hola/)
 {
  print "Existe";
 }

# Si "Hola Mundo" contiene la cadena "Hola". Como observamos en la comparación
SOLO se incluye la expresión regular.

Patrones

Hay otras combinaciones de caracteres que actúan como patrones. Se colocan entre
corchetes.

[qjk]       # Las letras q o j o k
[^qjk]      # Ni q ni j ni k. En estos casos el signo ^ al principio indica NO.
[a-z]       # Cualquier caracter desde a hasta z inclusive y en minúscula.
[^a-z]      # Ninguna letra en minúscula.
[a-zA-Z]    # Cualquier letra mayúscula o minúscula.

Modificadores y Caracteres de Control

Recordemos que los modificadores y caracteres de control empiezan por "\".

"\n" Nueva línea.
"\t" Tabulacíon.
"\s" Espacio.
"\S" No espacio.
"\r" Retorno de carro.
"\f" Nueva hoja (formfeed).
"\e" Secuencia de ESCape.
"\u" Pasa a mayúscula el primer caracter de texto siguiente".
"\U" Pasa a mayúscula todo el texto siguiente".
"\l" Pasa a minúscula el primer caracter de texto siguiente".
"\L" Pasa a minúscula todo el texto siguiente.
"\E" Fin del efecto de los modificadores \U,\L.
"\a" Emite un pitido.
"\cC" Combinación de Control+Letra. En este caso Control-C .
xN el signo por (x) seguido de un número N repite un caracter o texto anterior N veces.
SUSTITUCIONES EN EXPRESIONES REGULARES

En las sustituciones anteponemos a los delimitadores de expresión regular "/../" la letra
"s" de sustitución. Ej: s/Hola/Adiós/. Sustituimos la palabra "Hola" por "Adiós".Usando
la variable implícita $_ realizamos sustituciones rápidas.

$_="Hola Mundo";

s/Hola/Adiós/;
print $_;


Reemplazos Globales con la opción g

Reemplazamos todas las "o" por "a".

$_="Hola Mundo";

s/[o]/a/g;
print $_;

# Cambiamos en "Hola Mundo" todas las "o" por "a". La variable implícita


No tiene en cuenta mayúsculas y minúsculas.

$_="Oh, Hola Mundo";

s/o/a/gi;
print $_;

# Cambiamos en "Oh, Hola Mundo" todas las "o" por "a", incluso la que está en
mayúscula.


Entrada/Salida
Print

Es la instrucción básica para mostrar el valor de las variables en pantalla Ejemplo:

Print "Hola Perl";

Existen muchos modificadores para la salida de los valores de las variables. A
continuación vamos a estudiar algunas de ellos.

"\n"    Nueva línea.
"\t"    Tabulacíon.
"\r"    Retorno de carro.
"\f"    Nueva hoja (formfeed).
"\b" Espacio atrás (backspace).
"\e" Secuencia de ESCape.
"\u" Pasa a mayúscula el primer caracter de texto siguiente".
"\U" Pasa a mayúscula todo el texto siguiente".
"\l" Pasa a minúscula el primer caracter de texto siguiente".
"\L" Pasa a minúscula todo el texto siguiente.
"\E" Fin del efecto de los modificadores \U,\L.
"\a" Emite un pitido.
"\cC" Combinación de Control+Letra. En este caso Control-C .

Impresión en la impresora

# para Unix
open(PRT,'|lpr');
print PRT "hola mundo";
close(PRT) or die 'Error en la impresora';

Lectura de datos desde el Teclado

Para asignar un valor desde el teclado a una variable, se asigna a la variable la
representación del teclado <STDIN> (STandarDINput).
Ej: $var=<STDIN> .


print"¿Cómo te llamas?:";
$nombre=<STDIN>;
$nombre=chop($nombre);
print"Tu nombre es:$nombre";
chop() suele usarse para eliminar el último carácter de la entrada, normalmente nueva
línea.

Ejecutar un comando del sistema operativo

Print `ls –l `; o System(ls –l);

Son con comillas inclinadas a la izquierda

Lectura de parámetros pasados a un programa
Dentro de un programa en Perl los argumentos que se le pasan quedan guardados en el
arreglo @ARGV.

Ej: #!/usr/local/bin/perl
  print "Tu ingresaste las palabras:\n";
  for($x=0;$x<$#ARGV;$X++)
     {
     print "$ARGV[$x]\n";
     }

perl prog1.pl hola mundo chao
Tu ingresaste las palabras: hola mundo chao
Creación de Archivos

open (f1, "< readme.txt");
 # abrir para leer...
 # el < se puede omitir...
 @registros = <f1>;# lee todos los registro y le pasa a un arreglo
close (f1);

foreach$empleados (@registros)
{
 print $empleados;
}
# Cerramos


 open (f1, "> readme.txt");
  # abrir para escribir
  print f1 $datos;
close (f1);

 open (f1, ">> readme.txt");
  # abrir para agregar
  print f1 $datos;
close (f1);

f1 es la variable con la cual se va ha manejar el archivo dentro del programa.

SUBRUTINAS

  Como cualquier otro lenguaje, PERL permite al programador definir sus propias
funciones llamadas subrutinas. Se pueden colocar en cualquier lugar dentro de un
programa, pero es aconsejable colocarlas todas al principio o final. Para llamar a un
subrutina usamos el signo &.

# Inicio de programa con subrutina.

# Declaración de la subrutina.
sub saludo
{
print"Hola Mundo\n";
}

# Llamada a la subrutina.
&saludo;
PARÁMETROS

   A nuestras subrutinas podemos pasar distintos parámetros de modo que todos ellos
forman parte de una matriz especial representada como @_ (signos de arroba y
subrayado). Si recordamos las matrices o arreglos veremos que cada uno de los
parámetros será una variable dentro de la matriz que se direcciona así $_[0], $_[1],etc...

# Declaración de la subrutina.
sub saludo
{
print"@_\n";
}
# Equivale a @_=("Hola","Mundo\n")
#$_[0]="Hola" y $_[1]="Mundo\n"

# Llamada a la subrutina con 2 parámetros.
&saludo ("Hola","Mundo\n");

La salida del programa será: Hola Mundo
# Declaración de la subrutina.
sub saludo
{
print"$_[0]$_[1]";
}
#$_[0]="Hola" y $_[1]="Mundo\n"

# Llamada a la subrutina con 2 parámetros.
&saludo ("Hola","Mundo\n");


RETORNO DE VALORES

   Como cualquier función de cualquier otro lenguaje, PERL también nos permite
retornar valores y lo hace tomando como retorno el último valor escalar que se emplee
en la subrutina.

Ejemplo: Subrutina de suma de 2 números
# Inicio del programa

# Declaración de la subrutina.
sub Suma
{
$Total=$_[0] + $_[1]; #$_[0]=2 y $_[1]=3
}

# Llamada a la subrutina con 2 parámetros.
print &Suma (2,3);

La salida del programa será también: 5
ATENCIÓN: si tras la variable $Total tuviesemos otra variable,el valor final retornado
sería el valor de esta última variable.

Ejemplo:

# Inicio del programa

# Declaración de la subrutina.
sub Suma
{
$Total=$_[0] + $_[1]; #$_[0]=2 y $_[1]=3
$saludo = "Hola Mundo\n";
}

# Llamada a la subrutina con 2 parámetros.
print &Suma (2,3);

La salida programa sería,: Hola Mundo

Inclusión de archivos

Al igual que en C, uno puede incluir otro archivo con codigo perl. Con require
incluimos un archivo, el cual no necesariamente tiene que tener un 'main', es decir
pueden ser solo subrutinas.
Ejemplo:

#!/usr/local/bin/perl

require "otroarchiv.pl";

# sirve para agregar
# el codigo que esta en el archivo otroarchiv.pl


Funciones para manejo de arreglos

Push y Pop

Una común utilización de los arreglos es como stacks, donde los nuevos valores son
agregados y borrados por el lado derecho del arreglo. Push() es utilizado para agregar
elementos y pop() para sacar.

Ej: @lista=(1,2,3);
  push(@lista,5); # @lista=(1,2,3,5)
  $a=pop(@lista); # $a=5, @a=(1,2,3)
Shift y Unshift()

Al igual que Pop y Push estos sacan y meten elementos de un arreglo, pero lo hacen por
el lado izquierdo.

Ej: @a=(1,2,3);
  unshift(@a,0); # @a=(0,1,2,3);
  $x=shift(@a); # $x=0 , @a=(1,2,3)
  unshift(@a,5,6,7) # @a=(5,6,7,1,2,3)

El operador reverse

reverse() invierte el orden de los elementos de un arreglo, retornando la lista invertida.


Ej: @a=(1,2,3);
  @b=reverse(@a); # @b=(3,2,1)
  @c=reverse(1,2,3); # lo mismo


Notemos que la lista que se le pasa como parametro permanece inalterable. Si nosotros
queremos dejar la lista invertida ahi mismo debemos hacer : @a=reverse(@a)


Sort

Sort toma una lista y la ordena ascendentemente ( segun codigo ASCII ) y retorna la
lista ordenada.

Ej: @a=sort("grande","pequeño","chico"); # @a=("chico","pequeño","grande");
  @b=(1,2,4,8,16,32,64);
  @c=sort(@b); # @c=(1,2,16,32,4,64,8)


Como vemos en este ultimo ejemplo sort()ordena por strings, no numericamente.

Chop

chop() trabaja igual que en variables escalares, le saca el ultimo caracter a cada
elemento del arreglo.

Ej: @a=("hola","mundo\n","felices dias");
  chop(@a); # @a=("hol","mundo","felices dia")
Split() y Join()

Split()

Split() lo que hace es dado un separador, separa un string en un arreglo :

Ej: $linea="mvargas::117:10:Juan";
  @a=split(/:/,$linea); # @a=("mvargas","","117","10","Juan")

Join()

Join() hace lo inverso de Split(), dado un arreglo lo junta en un string, separado por un
delimitador especificado.

Ej:@campos=(1,2,"hola");
  $salida=join(":",@campos); # $salida="1:2:hola"

Pasar datos de un archivo a un vector

open (yclaves,"/export/bolsa/carpetas.txt") or die "Archivo Login no se pudo abrir
\n";
@xclave=<yclaves>;
close yclaves;

Ver cuantas filas tiene el arreglo

$#vector sería igual a 4.


Ver si existe un archivo

if ( -f "readme.txt" )
{
open (ARCHIVO,"readme.txt") or
       error("No puede abrir archivo readme.txt");
}

Cargar un archivo a un arreglo tipo hashes
open (f1, "< readme.txt");
  # abrir para leer...
  # el < se puede omitir...
  @registros = <f1>;# lee todos los registro y le pasa a un arreglo
close (f1);
$cclave=0;
while ( <ARCHIVO> )
{
 @tmpclaves = split /:/, $registros[$cclave];
 $busca_clave{$tmpclaves[0]} = $tmpclaves[1];
 $cclave++;
}
Funciones para arreglos tipo hashes

Delete

delete($matriz{clave}): Para borrar un par clave/valor de un "hash", utilizamos la
función delete que usa como argumento la variable escalar y la clave del par a borrar.

Ej: %lista=(uno,"1",dos,"2",tres,"3");

delete($lista{tres});

Exists, Defined
Ve si existe una llave:

 Ej: $existe=exists $lista{dos}; Si existe, la variable $existe contendrá el valor 1.
 Ej: $existe=defined $lista{dos}; Si existe, la variable $existe contendrá el valor 1.

Values

values(Hash): Muestra todos los valores de la matriz asociada.

 Ej: %lista(uno,"1",dos,"2",tres,"3");

  print values(%lista); muestra todos los valores del "hash", sin mantener un orden
determinado.

Keys

keys(Hash): Muestra las claves de la matriz asociada.

 Ej: %lista(uno,"1",dos,"2",tres,"3");

print keys(%lista); muestra todos las claves del "hash", sin mantener un orden
determinado.

Print sort(keys(%lista));


OTRAS FUNCIONES

length

length ( $a) devuelve la longitud del valor de $a

$a = "abcdf";
print length ( $a ); # imprime: 5

index

index ( $a , $x );
devuelve la posición de $x en $a
$a = "abcdef";
$b = index ( $a, "cd" );
print $b; # imprime: 2

uc y lc

uc ( $a ); devuelve los caracteres de $a en mayúsculas
lc ( $a ); devuelve los caracteres de $a en minúsculas

substr

substr ( $a, $pos, $len );
extrae un string de otro el 2do parámetro es la posición para empezar el 3er parámetro
es la longitud

$a = "abcdef";
print substr ($a, 2, 3);

# imprime: cde

$a = "abcdef";
substr ( $a, 2, 3 ) = "xy"; # cambia "cde" por "xy"

print $a   # imprime: abxyf

funcion FECHA

print "escuchando conexiones del cliente en el puerto: $puerto\n";
  $remoto = $servidor->accept;
  $remoto->autoflush(1);
  $recibe = <$remoto>;
  print $recibe;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
  $year=$year+1900;
  $mon =$mon + 1;
  print $remoto "hora: $hour minuto: $min segundos: $sec dia: $mday mes: $mon año: $year
\n";
  close $remoto

Quita los espacios en blanco de una cadena
$a=" h ola ";
print "$a\n";
print length($a);
$a=~s/ //gi;
print "$a\n";
print length($a);

Búsquedas en una cadena
Teniendo una cadena como "Hola Mundo", queremos comprobar si dentro de ella se
encuentra la palabra "Hola".

$cadena="Hola Mundo";
if($cadena =~/Hola/)
   {
   print "Si existe";
  }

Podríamos traducirlo como "Si "Hola Mundo" contiene "Hola".

Crypt

Encripta una palabra mediante un número
$clave=crypt($word, $pwd)

chr

Devuelve el carácter ascii de un número:

Print chr(65) # imprime A

Ord

Devuelve el número ascii de un caractér:

Print ord(“a”) # imprime 65


Abs, cos, int, log, rand, sin, sqrt,

Funciones Absoluto, coseno, entero, logaritmo, número randomico, seno, raiz cuadrada.

Abs(),cos(),int(),log(),rand(),sin(),sqrt()

Chdir

Para cambio de directorio

chdir '/usr/spool/news' || die "error: $!\n"

rmdir

borra un directorio

rmdir glob '/perl/pablo';

glob es la manera para indicar todo lo que esta en pablo

								
To top