![]() |
![]() |
|||||
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
![]() |
Operaciones sobre arreglos
Push y Pop
Una comun utilizacion 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. @lista=(1,2,3);
push(@lista,5); # @lista=(1,2,3,5)
$a=pop(@lista); @a=(1,2,3)
# $a=5,
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);
# @c= (3,2,1)
Notemos que la lista que se le pasa como parámetro permanece inalterable.
Si nosotros queremos dejar la lista invertida ahí 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")
Operaciones
raras@a=(1,2,3,4,5); ($b,$c,$d)=@a;
#
b=1 c=2 d=3
@a=(1,'b',2,'c'); $b,@a)=@a; # b=1 a=('b',2,'c')
@a=('hola','tu'); @b=(1,2,@a,7,8); # b=(1,2,'hola','tu',7,8)
@a=(1,2,3,4,5); @b=@a[1,3];
#
b=(2,3,4)
@b=(1,2,3,4,6)[0,1]; # b=(1,2)
@a=(7,8,9); @b=(1,2,0); @c=@a[@b];
#
c=(8,9,7)
Estructuras de control: Maneja
las clasicas: if, for, while if,elseif,else
La estructura de un if es la siguiente : if ( .... ) {
......; ......; } elsif ( .... ) { ......;
......; } elsif ( .... ) {
......; ......; } else ( .... ) { ......;
......; }
Notemos que los elsif y el else van solo si el usuario desea varias preguntas, se podria usar por ejemplo : #!/usr/local/bin/perl { print "Tu eres menor de edad\n"; } else { print "Eres un adulto\n"; }
While y until
La forma del while es : while ( condicion ) { ....; ....; }
Lo que esta entre llaves se ejecuta mientras sea veradera la condicion. Ej:
print "Cuantos años tienes?"; $a=<STDIN>; chop($a); while
( $a > 0 ) { print
"El año pasado tenias $a años\n"; $a--;
}
La forma del until es : until ( condicion ) { ...; ...; }
A diferencia del while el until se ejecuta al menos una vez , y se sigue mientras la condicion sea falso , es decir es similar al Repeat/Until de Pascal. For
La forma general del for es : for ( exp_inicial; exp_testeo; exp_increm){ ...; ...; } Ej: 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 ) { ...; ...; ...; } Ej:
@a=(3,5,7,9); foreach $x (@a) {
$y=$x*3; print "$y\n"; } Imprime 9,15,21,27 .
If y unless
Hemos visto que todas las estructuras de control necesitaban de llaves, aunque solo fuera una instruccion; pero esto es incomodo por ejemplo para los if, es por eso que el if se puede usar de otra forma, poniendolo al final de lo que queremos ejecutar: Ej: print "Aqui es, Paulina" if ( $user eq 'Paulina' );
Tambien existe el unless, que hace todo lo contrario del if, es decir, ejecuta la accion si no se cumple la condicion del final: Ej: $a=45 unless ($a < 12 ); # b valdra 45 si a>=12
Manejo de archivos:
Procesamiento de archivos
Como en todo lenguaje en Perl se puede trabajar con archivos. Lo primero que se hace es abrirlo y luego leerlo : open(FILE,"file1");
while ( $a=<FILE> ){ .....; }
close(FILE);
Lo que hicimos en la 1a linea es abrir el archivo de nombre file1 y a ese archivo le asignamos el "file handler" : FILE ( debe ser cualquier nombre pero en mayuscula ) . Luego con el while vamos leyendo linea a linea ( tambien podriamos haberlo hecho como con <STDIN> de asignar una variable de tipo arreglo a <FILE> y habriamos leido el archivo de una pasada ) . Finalmente algo muy importante, es cerrar el archivo . Escribir en un archivo. #!/usr/local/bin/perl $file='hola.txt'; open (A,">$file"); # Abrimos para solo escritura
el archivo hola.txt print A "aprendiendo a escribir
en archivos con perl\n"; print A "1 2 3 4 5 6 7 8 9\n"; close(A);Append a un archivo: Este crea un archive llamado
hola.txt y escribe en una linea y luego en la siguiente.
@l=('a',"\n",'b',"\n"); open(G,">>/user/jperez/d.txt"); # Abrimos para escritura pero append print G @l; close (G);
Veamos dos ejemplos mas interesantes:
open (A, "file") || die "No se puede abrir\n";
| |
vale 1
Un programa que simula 'cp' $#ARGV != 2 || die "use a.pl origen destino"; open (A,"$ARGV[0]")||die("No se puede leer el
origen"); open
(B,">$ARGV[1]")||die("No se puede escribir en el destino"); while( ) { print
B || die "No se pudo escribir"; }
Inclusion de archivos
Al igual que en C, uno puede incluir
otro archivo con codigo perl. #!/usr/local/bin/perl
require "otroarchiv.pl"; # sirve para agregar # el codigo que esta en el archivo otroarchiv.pl
Otra forma es con eval, el cual
en realidad no sirve en si para incluir archivos, sino que evalua expresiones. $exp='$nombre="juan"; $apellido="perez"; $nombre.=$apellido; print
"hola $name\n";'; eval
$exp; #
imprimira 'hola juanperez'
Entonces usando eval, podriamos incluir un archivo y que se ejecute: $arch=`cat archivo`; $eval $arch;
Como ejecutar comandos Linux desde script de Perl
Con system (comando)
Ejemplo:
System (ls)
Lista el contenido del directorio de ejecución
del script. Tambien
funciona con comillas y sin comillas.
Otro ejemplo:
#!/usr/local/bin/perl system ("pwd"); system ("ls"); system ("cat
eje1.pl");
Muestra la ruta del directorio, lista el contenido el directorio y abre el archive eje1.pl en
caso de que exista.
Igual que en C++ podemos usar la función exec para ejecutar programas externos, en Perl podemos hacer uso de la función system() $valor = system("ls -l"); if($valor != 0) {
print "Error al ejecutar la orden"; }
Otra opción es usar la función "`STRING`", que ejecuta el comando que indiquemos entre las comillas simples, y devuelve como array las líneas que ese comando mostrara: @output = `orden`;
Una de las principales fortalezas de Perl es interactuar bastante bien con los recursos del sistema, y eso incluye
a Shell, sin embargo, por lo regular es mejor tener todo tu código en un solo lenguaje y siendo que todo lo que puedes hacer con shell
lo puedes hacer con Perl es algo que debes considerar el reescribir tu programa en Perl para que sea un poco mas sencillo en el sistema como un
todo.
Para borrar un archivo se me ocurren las siguientes
opciones:
$archivo="<poga aqui la ruta del archivo a
borrar>"; #Inicio
de alternativas, con system system("rm $arhivo"); #con exec, el lo último que hacemos exec("rm $archivo"); #con `` `rm $archivo`; #con open
(duh!) open(AN,"rm $archivo"); close(AN); #(no nos importa su salida estandar)
#O como debe ser, con una función de Perl unlink $archivo;
Hay cuatro principalmente, que son las mismas
que para ejecutar cualquier otro programa de UNIX desde Perl:
system() exec() open() ``
Explicación:
system(<comando>); Te permite ejecutar un comando (o script de shell) y pasarle todos los parametros
que quieras, sin embargo,
no captura ni su salida estandar ni su entrada estandar y tu programa en Perl espera hasta que termine (si no termina tu programa en Perl esperará por siempre, a menos de que hagas
magia pesada con señales que no viene al caso, simplmente asegurate de que tu programa termine). <comando> Es una expresión que te permite
especificar lo que debe hacerse de modo similar a como lo harías en el prompt de shell, si usas "" puedes usar variables y todo lo demas. System debe usarse cuando deseas que un comando
(que ya sabes que resultado
tendrá) se ejecute cuando toda la información que necesitas pasarle será en forma de parametros y no te interesa lo que escribe a
su salida
estandard. Además, deseas que tu programa en Perl continue corriendo DESPUES de ejecutar el comando.
exec(<comando>) Con este también ejecutas un comando, pero nunca
regresa el control a tu programa, de hecho, con exec terminas tu programa para inciar, en su lugar, a otro (la peudes pasar todos los parámetros
que quieras). Como se deduce, tampoco puedes enviar nada a su entrada o recoger nada de su salida estandar. exec se usa sobretodo cuando deseas que tu programa
en Perl prepare el camino para un comando o programa escrito en otro lenguaje, me ha llegado a pasar con un par de clientes de bases de datos y aplicaciones que requieren mucha configuración del ambiente
en función de las tareas a realizar.
open(<handle>,<comando>) Como sabrás, open se suele usar para abrir archivos
ya sea para lectura o escritura, pero tembién se puede usar para ejecutar un comando y capturar ya sea su salida estandar o su entrada
estandar. <handle> Es un identificador para tener tu file handle. <comando>
Es el comando UNIX a ejecutar y todos sus parametros, además, si deseas capturar su entrada estandar debes anteponer un pipe "|" mientras que si deseas capturar su salida estandar
debes terminar el comando
con pipe "|". No puedes capturar a la vez la entrada y la salida estandar. Cuando ejecutas el comando con open, debes capturar toda la salida estandard o alimentar su entrada estandard hasta
que termine, una vez hecho esto, debes ejecutar close <handle>, es ese momento Perl ignora el resto de la salida estandar del archivo o manda
un ^D a su entrada estandar y espera a que termine el comando para regresar control a tu script. Open, como te imaginarás, se usa para ejecutar comandos o programas a los que deseas pasar o recibir información de
su entrada o salida estandard. En las ocaciónes en que uno tiene que usar programas interactivos lo unico que se puede hacer es redireccionar, por ejemplo, su entrada estandar a un archivo que escribamos
para el caso con anterioridad
(de modo que el comando se convierte en algo como "temp > comando par1 par2") y capturamos su salida estandar para ver los resultados que nuestras instrucciones prehechas
tienen (el comando final para el open será "temp > comando par1 par2 |").
Por último. $algo=`comando`; Al ejecutar un comando con `` se hace el equivalente a un open,
pero solo
se captura la salida estandar del comando y se regresa completa como valor de evaluar la expresión. En el ejemplo, $algo tendrá
todo lo que
el comando <comando> haya escrito a su salida estandar. Se usa esta forma de ejecución cuando no se desea generar mucho código por la ejecución de programas sencillos de SO
y se desea capturar sus resultados.
Ejemplo:
$algo = `ls`; print ($algo);
Otro ejemplo:
$algo = `ls`; $file='hola.txt'; open (A,">$file"); # Abrimos para solo escritura el archivo hola.txt print A "mira coño de tu madre este es el resultado\n"; print A "$algo\n"; close(A);
Este programa ejecuta el comando ls y escribe
el resultado en un archivo llamado hola.txt.
Programación con sockets: La programación con sockets es muy facil en PERL, porque un programa que en C ocupa 100
líneas de código, en perl se puede hacer en 5 o 6, gracias al módulo IO::Socket. Para usarlo basta con poner: use IO::Socket; Para conseguir información en sistemas Linux deben poner: perldoc IO::Socket y de esta manera pueden leer bastante información. Cliente de comandos sencillo: #!/usr/bin/perl -w use IO::Socket; use Net::hostent;
# OO version of gethostbyaddr $PORT = 9000;
# pick something not in use $server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT,
Listen => SOMAXCONN,
Reuse => 1); die "can't setup server" unless $server; print "[Server $0 accepting clients]\n"; while ($client = $server->accept()) { $client->autoflush(1); print $client
"Welcome to $0; help for command list.\n"; $hostinfo = gethostbyaddr($client->peeraddr); printf "[Connect
from %s]\n", $hostinfo->name || $client->peerhost; print $client
"Command? "; while ( <$client>)
{ next
unless /\S/; # blank line if (/quit|exit/i)
{ last;
} elsif
(/date|time/i)
{ printf $client "%s\n", scalar localtime; } elsif
(/who/i )
{ print $client `who 2>&1`;
} elsif
(/cookie/i )
{ print $client `/usr/games/fortune 2>&1`;} elsif
(/motd/i )
{ print $client `cat /etc/motd 2>&1`; } else
{
print $client "Commands: quit date who cookie motd\n"; } } continue { print
$client "Command? "; } close $client; } Para probarlo, basta con ejecutarlo simplemente, y para conectarse a él, se puede poner
algo así: telnet 127.0.0.1 9000 Y nos aparecerá el servidor automáticamente, para poner comandos. Estos ejemplos están extraidos de la página de manual perlipc, mas información con: man perlipc Y luego se busca "IO::Socket" (con la barrita
/). Puerto serial Para el control del puerto serial podemos usar el siguiente programa: sysopen(PI,"/dev/ttyS0", O_RDWR|O_NDELAY) or die "No puede abrirse /dev/ttyS0: $!"; # Lo abro para leer open(PO,"+>&PI") or die "No puede duplicarse PI: $!"; # Lo dup()eo para escribir select((select(PO), $| = 1)[0]); #
Agitar de manos... print PO "Esto va al puerto\n"; $r = <PI>; #
Esto lee del puerto... print ($r); Retardo Esta función se usa para retardos menores de 1 seg: select(undef,undef,undef,0.5); El ejemplo anterior define un retardo de 0,5 segundos. Retardo de 3 seg aprox, en sistema unix/Linux esto no es tiempo real, por lo tanto es
aprox. $a=500; select(undef,undef,undef,0.5); select(undef,undef,undef,0.5); select(undef,undef,undef,0.5); select(undef,undef,undef,0.5); select(undef,undef,undef,0.5); select(undef,undef,undef,0.5); print ($a); Otra manera de lograr retardos es con la función sleep (retardos mayores de 1 seg) Retardo de 5 segundos: # retardo de 5 seg $a=500; sleep (5); print ($a);
![]()
|
|
|
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |