![]() |
|
|||||
|
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>=12Manejo 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 appendprint 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/perlrequire "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 PerlCon 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/perlsystem ("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 bastantebien 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 ysiendo que todo lo que puedes hacer con shell
lo puedes hacer con Perles algo que debes considerar el reescribir tu programa en Perl para quesea 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 systemsystem("rm $arhivo");#con exec, el lo último que hacemosexec("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 Perlunlink $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 (oscript de shell) y pasarle todos los parametros
que quieras, sinembargo,
no captura ni su salida estandar ni su entrada estandar y tuprograma en Perl espera hasta que termine (si no termina tu programa enPerl esperará por siempre, a menos de que hagas
magia pesada con señalesque no viene al caso, simplmente asegurate de que tu programa termine).<comando> Es una expresión que te permite
especificar lo que debehacerse 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 queresultado
tendrá) se ejecute cuando toda la información que necesitaspasarle será en forma de parametros y no te interesa lo que escribe a
susalida
estandard. Además, deseas que tu programa en Perl continuecorriendo DESPUES de ejecutar el comando.exec(<comando>)Con este también ejecutas un comando, pero nunca
regresa el control a tuprograma, de hecho, con exec terminas tu programa para inciar, en sulugar, a otro (la peudes pasar todos los parámetros
que quieras). Comose deduce, tampoco puedes enviar nada a su entrada o recoger nada de susalida estandar.exec se usa sobretodo cuando deseas que tu programa
en Perl prepare elcamino para un comando o programa escrito en otro lenguaje, me hallegado a pasar con un par de clientes de bases de datos y aplicacionesque requieren mucha configuración del ambiente
en función de las tareasa realizar.open(<handle>,<comando>)Como sabrás, open se suele usar para abrir archivos
ya sea para lecturao escritura, pero tembién se puede usar para ejecutar un comando ycapturar 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 elcomando
con pipe "|". No puedes capturar a la vez la entrada y la salidaestandar.Cuando ejecutas el comando con open, debes capturar toda la salidaestandard o alimentar su entrada estandard hasta
que termine, una vezhecho esto, debes ejecutar close <handle>, es ese momento Perl ignora elresto de la salida estandar del archivo o manda
un ^D a su entradaestandar y espera a que termine el comando para regresar control a tuscript.Open, como te imaginarás, se usa para ejecutar comandos o programas alos que deseas pasar o recibir información de
su entrada o salidaestandard. En las ocaciónes en que uno tiene que usar programasinteractivos lo unico que se puede hacer es redireccionar, por ejemplo,su entrada estandar a un archivo que escribamos
para el caso conanterioridad
(de modo que el comando se convierte en algo como "temp >comando par1 par2") y capturamos su salida estandar para ver losresultados que nuestras instrucciones prehechas
tienen (el comando finalpara el open será "temp > comando par1 par2 |").Por último.$algo=`comando`;Al ejecutar un comando con `` se hace el equivalente a un open,
perosolo
se captura la salida estandar del comando y se regresa completacomo valor de evaluar la expresión. En el ejemplo, $algo tendrá
todo loque
el comando <comando> haya escrito a su salida estandar.Se usa esta forma de ejecución cuando no se desea generar mucho códigopor la ejecución de programas sencillos de SO
y se desea capturar susresultados.Ejemplo:$algo = `ls`; print ($algo);Otro ejemplo:$algo = `ls`; $file='hola.txt';open (A,">$file");# Abrimos para solo escritura el archivo hola.txtprint 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);
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||