| Login | Tour | Inicio | Chat | Descargas | Wallpapers | Páginas recientes | FAQ | | ||
Custom Search
![]() Emacs como IDE para CakePHP aarkerio La Negación del Viaje Lunar tonathiu Porque los mononeurones si tenemos madre! blacksoul BrunoFerías thot The Art vendaval Aclimatación extraterrestre ¿para qué? ahuramazdah ¿A que le tienes miedo? teosho Sobre nazis, terror y medios tonathiu Amenazas a la cuarta dimensión ¿de veras? ahuramazdah Tarjeta Broadcom BCM94311MCG rev 02 teosho Pidiendo OpenSolaris 2008.5 vendaval Sospechosismo aarkerio Slackware 12.1 Final vendaval Jaime Maussan da por auténtico video trucado del chupacabras hecho en Blender 3D asarch Linux hot girl aarkerio Calderón puede ser sujeto a juicio político, sostiene Carrancá tonathiu La desnutrición en México aarkerio Sistema Infalible ordbal Histórico aarkerio Nietzsche en la FCPyS aarkerio ![]() GNU/Linux ![]() Hacktivismo ![]() Debian ![]() NetBSD ![]() WWW ![]() Guia Linux ![]() Server Side ![]() Ofimatica ![]() Despabilando... ![]() Mundo Maya ![]() Literatura ![]() Agora ![]() Psicologia ![]() Economia ![]() Ambientalismo ![]() Desarrollo Biologia ![]() |
Desarrollo \ Introducción al Lenguaje PERL Este artículo ha sido consultado en 462 ocasiones. (http://infodisc.es/abcd/tutoriales/program.html) PERL es un lenguaje interpretado que tiene varias utilidades, pero está principalmente orientado a la búsqueda, extracción y formateado de ficheros de tipo texto. También es muy usado para manejo y gestión de procesos (estado de procesos , conteo y extracción de parámetros característicos, etc...). Es una combinación de las características de los lenguajes más usados por los programadores de sistemas, como son los shell del sistema operativo UNIX, los utilidad (que incluye un lenguaje interpretado propio) awk para formateo y tratamiento de texto e incluso caracteristicas de Pascal, aunque su potencia se basa en la similitud con las mejores características del lenguaje estructurado C. En general cualquier utilidad que se necesite realizar en sh, awk, o sed, se puede implementar de una manera mas potente y sencilla mediante el lenguaje PERL. Algunas de las ventajas del uso del lenguaje PERL son las siguientes:
Un primer programa en PERLEn primer lugar para ejecutar un programa en PERL podemos hacer dos cosas:
% perl primer.plLa extensión pl no es necesaria, pero se suele poner.
#! /usr/bin/perlAdemas debemos cambiar los permisos del fichero fuente, para poderlo ejecutar. Esto se realiza mediante la instrucción chmod: chmod u+x primer.plA continuación de la primera linea escribiríamos el guión del programa, y una vez hecho esto simplemente invocaríamos el nombre del programa directamente desde la línea de comandos. % primerl.plLos caracteres #! sirven para denotar que lo que viene a continuación hace referencia a un interprete de comandos. Por ejemplo un perl scripts que mostrará por la pantalla
el mensaje HOLA MUNDO se haría de la siguiente forma:
#! /usr/bin/perl print "HOLA MUNDO\n"; Tipos de datos en PERLPerl tiene tres tipos de datos:
Por ejemplo, si queremos definir una variable de tipo escalar llamada número y que contenga el número 12 haríamos: $numero = 12;Para almacenar una cadena de caracteres podemos hacer dos cosas:
$palabra = 'perros'; $palabra = " perros \n";Por último, podemos definir varias variables al mismo tiempo utilizando los paréntesis por ejemplo: ($palabra1,$palabra2,$palabra3) = ("JUAN","PEPE","LUIS");
El tipo de dato array de escalares es denotado mediante un nombre de variable
precedido del símbolo @. Un ejemplo de inicialización de una variable de
este tipo podría ser:
@frutas = ("manzana","pera","naranja","fresa");
El número de elementos menos uno de un array de escalares se puede
obtener mediante el nombre de la variable precedido de los simbolos $#,
por ejemplo si queremos obtener el número de elementos de @frutas
haríamos:
$numero_de_elementos = $#frutas+1;Para ser más exactos $# nos devuelve el último indice del array, así, si el valor para el primer indice es 0 el número de elementos - 1 será el último valor permitido para indexar el array. El acceso a un elemento de un array se hace mediante un índice numérico de la forma $nom_variable [ indice ] ; asi, si quisieramos acceder al tercer elemento de @frutas haríamos: $2_elemento = $frutas[2];También podemos acceder a varios elementos de un array de la forma @nom_variable[indice1,...,indicen], por ejemplo: print @frutas[1,2];imprimirá el elemento segundo y tercero del array @frutas. Otra forma de indexar un array es usando el operador rango .. , si quisieramos imprimir todos los valores desde un indice i hasta un indice j deberiamos utilizar el siguiente formato @nom_variable[i..j], por ejemplo: print @frutas[0..2];imprimirá todos los elementos del array @frutas. Por último tenemos también el tipo de dato array asociativo de escalares, mediante este tipo de datos podemos acceder a un determinado elemento de un array a través de una clave anteriormente definida, para denotar este tipo de dato debemos preceder al nombre de la variable con el símbolo % . Un ejemplo de definición de claves y valores de un determinado array asociativo podria ser: %precio = ( "manzana",100,"pera",20,"naranja",30,"fresa",200 );Si queremos acceder a un elemento de un array asociativo, debemos seguir el siguiente formato @nom_variable { clave }, un ejemplo podría ser: $numero_de_manzanas=10;
$gasto = @precio {"manzana"} * $numero_de_manzanas;
Sintaxis generalComo ya habrás podido observar todas las intrucciones de PERL deben terminar en ";".Ejemplo $numero = 2; print $numero;Además las únicas cosas que deben de ser declaradas en PERL son los formatos de salida o reports y las subrutinas. Todas las variables creadas y no inicializadas tienen como valor por defecto nulo o cero. Los comentarios deben ir precedidos del símbolo #. Ahora veremos de forma práctica el uso de las sentencias de control condicionales e iterativas que suministra el lenguaje PERL para alterar el flujo de un programa. En primer lugar entenderemos como BLOQUE a todo conjunto de sentencias que se encuentren entre dos llaves, por ejemplo lo siguiente sería un bloque: {
$numero=2;
print $numero;
}
Los bloques, además, pueden ser etiquetados anteponiendo a la llave
de apertura el nombre de la etiqueta mas dos puntos.
En segundo lugar entenderemos como EXPRESION a toda expresión cuya evaluación resulte ser un valor booleano, es decir, verdadero o falso. Hay que tener en cuenta que en PERL se considera como verdadero todo valor no nulo luego se pueden presentar como expresiones el resultado de una asignación,de una búsqueda etc... Una vez hechas estas consideraciones pasamos a ver la sintaxis de los distintos esquemas de control, que como ya hemos dicho antes pueden ser:
print " PENSANDO UN NUMERO ....\n";
$numero = rand(100);
print "Introduce un numero del 1 al 100:";
$entrada = <STDIN>;
if($entrada == $numero) {print "Has acertado el numero\n";}
if($entrada > $numero) {print "El numero introducido es mayor que el pensado.\n";}
if($entrada < $numero) {print "El numero introducido es menor que el pensado.\n";}
print " EL NUMERO PENSADO ERA:",$numero;
if (EXP) BLOQUE else BLOQUE. Un ejemplo podria ser:
print " PENSANDO UN NUMERO ....\n";
$numero = rand(100);
print " Introduce un numero del 1 al 100:";
$entrada = <STDIN>;
if($entrada == $numero)
{
print "Has acertado el numero\n";
}
else
{
if($entrada > $numero)
{
print "El numero introducido es mayor que el pensado.\n";
}
else
{
print "El numero introducido es menor que el pensado.\n";
}
}
print " PENSANDO UN NUMERO ....\n";
$numero = rand(100);
print " Introduce un numero del 1 al 100:";
$entrada = <STDIN>;
if($entrada == $numero)
{
print "Has acertado el numero\n";
}
elsif($entrada > $numero)
{
print "El numero introducido es mayor que el pensado.\n";
}
else
{
print "El numero introducido es menor que el pensado.\n";
}
En lugar de if podemos usar unless que tiene el significado contrario.
Dentro de los esquemas iterativos tenemos:
print " PENSANDO UN NUMERO ....\n";
$numero = rand(100);
$entrada = $numero+1;
while ($entrada > $numero)
{
print " Introduce un numero del 1 al 100, menor que el pensado:";
$entrada = <STDIN>;
if($entrada > $numero)
{
print "El numero introducido es mayor que el pensado.\n";
}
}
print " EL NUMERO PENSADO ERA:",$numero;
print "\n";
En lugar de while podemos usar until, que tiene el efecto contrario a éste.
Si además queremos hacer la primera comparación después
de la primera iteración, podemos usar un esquema iterativo do BLOQUE
until o do BLOQUE while.
print "IMPRIMIENDO DEL 1 al 100:\n";
getc;
for($i=1;$i<101;$i++)
{
print $i."\n";
}
Y por último tenemos:
@frutas=("manzana","pera","naranja","fresa");
foreach $fruta (@frutas)
{
SubrutinasOtro aspecto de interés en PERL es la definición y manejo de subrutinas. El formato de declaración de una subrutina es: sub NOMBRE BLOQUEEjemplo : sub HOLA
{
print "HOLA\n";
}
La llamada a la subrutina la haríamos usando:
Las dos formas producen el mismo resultado con la excepción de que en el caso de do hay siempre que poner los paréntesis, si queremos pasar argumentos debemos pasar los argumentos entre estos paréntesis, y estos serán almacenados en el array de escalares @_, es decir para saber el número y el valor de los argumentos pasados a una subrutina hay que leer de este array predefinido. Un ejemplo podría ser el siguiente: sub imprime
{
local ($cadena)=@_;
print $cadena;
}
&imprime ("HOLA\n");
En el ejemplo anterior se usa la función local(), que sirve para
declarar variables locales a la subrutina, por supuesto podríamos
haber referenciado directamente el array @_.
El valor retornado por la subrutina es el de la última expresión evaluada, y puede ser tanto un array como un escalar. También podemos devolver explicitamente un valor usando return, como en C. También resulta interesante la declaración y uso de formatos o reports. Con la definición de un report, estamos alterando el formato de salida de los registros cuando utilizamos la función write. La sintaxis para la definición de un formato es: format NOMBRE = FORMLIST .Si NOMBRE se omite, entonces STDOUT es tomado como el dispositivo de salida. FORMLIST contiene el formato de la salida de la forma: SANGRADO_CAMPO1,SANGRADO_CAMPO2,...,SANGRADO_CAMPON variable1, variable2,.........,variablen El tipo de sangrado se consigue usando los símbolos:
Un ejemplo de salida formateada podría ser:
format STDOUT_TOP =
SALIDA FORMATEADA DE WHO
.
format STDOUT =
Usuario Conectado en Momento de la conexion
______________________________________________________________________________
@<<<<<<<<<<<<<<<<<<<<<<<<<@|||||||||||||||||||||||@>>>>>>>>>>>>>>>>>>>>>>>>>
$usuario ,$tty ,$conectado
.
open(WHO,"who|");
while ($who = <WHO>)
{
chop $who;
($usuario,$tty,$conectado) = split(/\s+/,$who,3);
write;
}
close(WHO);
Operadores en PERL.PERL soporta una gran cantidad de operadores, la mayoría de ellos heredados del lenguaje C. En PERL los operadores conservan el mismo uso que en el resto de los lenguajes, y se utilizan para realizar operaciones aritméticas, operaciones lógicas ..., entre las variables del programa. Los operadores pueden clasificarse en los siguientes tipos:
if ($var == 3) { ...}
en el caso de que el contenido de la variable sea tres se realizan las
operaciones entre paréntesis.
if ($var != 3) { ...}
si los valores son diferentes se ejecutan la instrucciones entre llaves.
; if ($var < 3) { ...}
ejecuta las instrucciones entre paréntesis si el valor de var es menor
que tres.
if ($var > 3) { ...}
ejecuta las instrucciones entre parentesis si el valor de var es mayor
que tres. Los operadores para los terminos menor o igual y mayor o igual
son <= y >= respectivamente, y en ambos casos además de el significado
de cada término explicado anteriormente, se devuelve cierto si las
expresiones son iguales.
Como en el caso de las operaciones anteriores, existen equivalentes que se utilizan con las cadenas no númericas para los terminos < y >. Estos operadores son: ltque devuelve cierto si el orden de la cadena de la izquierda es menor que el de la cadena de la derecha, y gt que devuelve cierto si la cadena de la izquierda es mayor que el orden de la cadena de la derecha.
'one' cmp 'one' DEVUELVE 0 'one dog ' cmp 'one' DEVUELVE 1 'dog one' cmp 'one' DEVUELVE -1 'es diferente' cmp 'one' DEVUELVE -1
if ($var =~/pepe/) { ...}
verifica si la cadena 'pepe' se encuentra dentro de var y si es así,
ejecuta el código entre llaves.
if ($var !~/pepe/) { ...}
si la cadena 'pepe' no esta en var se ejecuta el código entre llaves.
$var = 'Buenos dias';asigna la cadena 'Buenos dias' a la variable var.
$var =~ s/one/uno/;se reemplaza la ocurrencia de la cadena 'one' por la cadena 'uno'.
$var = 6; $var**2;el valor almacenado en var es 36.
$var = 'Juan '; $var . 'Ramirez';var contendrá la cadena Juan Ramirez.
'd' x 20;expresa una cadena de 20 caracteres d.
$var = 5 % 2;el valor que se asigna a var es 1.
$var = 3 | 2;el valor que se asigna a la variable es 3.
$var = 3 & 2;el valor asignado es 2. El operador de asignación = está muy relacionado con los operadores aritméticos de modo que PERL permite que se combinen ambos siguiendo este formato general: $variable (operador aritmetico)= expresión;En general lo que se consigue con este formato es realizar la operación aritmetica, y posteriormente asignar el valor a la variable. Así aquí vemos algunos ejemplos de esta combinación: $var = 5; $var += 6;después de esta asignación el valor de var sera 11 (ha sumado 6 al valor anterior de la variable y posteriormente ha asignado el resultado). $var = 5; $var %= 2;el valor actual de la variable sera 1.
if ($var !~/pepe | juan/) { ...}
el código entre llaves se ejecuta si en la cadena que se encuentra
dentro de la varible existe una ocurrencia igual a 'pepe' o igual a 'juan'.
Además de utilizarse dentro de las expresiones regulares, también se utiliza para unir mediante la operación 'o' dos expresiones condicionales. Así por ejemplo: if ($var == 6 | $var < 3) { ...}
ejecuta el código entre llaves si la variable es igual a 6 o menor
que 3.
if ($var =~ /coche & moto/) { ...}
el código entre parentesis se ejecuta si dentro de la variable existe
una ocurrencia de la cadena 'coche' y otra de la cadena 'moto'. Como en
el caso del operador | también se utiliza para relaccionar expresiones
condicionales.
if (!$var) { ...}
el código entre llaves se ejecuta si la variable var es nulo o 0.
Variables predefinidasLos siguientes nombres tienen un significado especial en PERL sólo incluiremos los más frecuentes, para una información más detallada consulte el manual de usuario:
Expresiones regulares.Las expresiones regulares en PERL nos permiten evaluar o comparar la existencia de un patrón de búsqueda en una cadena o un valor determinado; así por ejemplo, si se tiene un archivo de muchas líneas y se quiere imprimir las líneas que tengan en su inicio un determinado carácter, o se desea reemplazar todas las ocurrencias de una determinada palabra dentro del fichero, se deben emplear las expresiones regulares. Se pueden dividir las expresiones regulares en los siguientes tipos:
valor a comparar =~ /patrón de búsqueda/; El principal uso de las expresiones regulares de comparación es la formulación de condiciones en cualquiera de las estructura lógica estructuras lógicas permitidas en PERL. Las expresiones regulares de comparación soportan la siguiente opción:
valor a sustituir =~ s/patrón de búsqueda/sustitución/; Dentro de las expresiones regulares de sustitución encontramos las siguientes opciones:
variable =~ tr/(patrón de búsqueda)/(cadena_a_traducir)Las expresiones regulares de traducción no tienen opciones, la búsqueda y sustitución se realiza en el contenido de toda la variable. Pasamos a mostrar un ejemplo que ilustre todo lo anteriormente dicho de las expresiones regulares: Supongamos que tiene un archivo de tipo texto con el siguiente contenido: tres perros tres gatos y tres elefantes.Las siguientes expresiones regulares casuarán los efectos que se especifican: open(AR,'prueba.prb')|| die "$!\n";
while(<AR>)
{
if( $_ =~ /tres/ )
{ print "Se ha encontrado la cadena 'tres'";}
}
El segmento de código anterior realiza las siguientes operaciones: abre
un fichero prueba.prb de tipo texto y lo asigna a la variable AR, trás
lo cual realiza un bucle while que permite recorrer todo el contenido del
fichero. Dentro de este bucle, utilizando la variable predefinida $_ (que
guarda el contenido de la última línea del fichero definido como
entrada); observa mediante una condición if si dentro del registro
existe una cadena igual a 'tres'. Como se ve dentro de la condición
se utiliza una expresión regular de comparación que devolverá
cierto si se encuentra la cadena patrón dentro de la variable (
en este caso el contenido de una línea). En el caso de que la expresión
regular devuelva cierto se indica que se encontró la cadena buscada.
open (AR,'prueba.prb') || die "$!\n";
while (<AR>)
{
$_ =~ s/tres/---/g;
print ;
}
Este ejemplo, entra de manera similar al anterior dentro del fichero prueba.prb,
tras lo que sustituye dentro de este fichero todas las ocurrencias de la
cadena 'tres' por la cadena '---'. Esto se realiza mediante una expresión
regular de sustitución. Con esto la salida por pantalla sería
la siguiente:
--- perros --- gatos y --- elefantes.
open(AR,'prueba.prb') || die "$!\n";
while (<AR>)
{
$_ =~ tr/tre/1234/;
print ;
}
La salida por pantalla de este ejemplo es la siguiente:
123s p322os 123s ga1os y 123s 313fan13s.El código anterior realiza una traducción en el contenido de nuestro fichero prueba.prb, el cual es abierto de la misma manera que en los otros casos. Como se ve en el resultado, cada vez que hay una ocurrencia del caracter 't' este se sustituye por '1', cuando aparece un caracter 'r' la sustitución se hace por el '2' y por último cuando aparece un caracter 'e' la traducción lo sustituye por el tercer valor de la cadena de sustitución, en este caso 3. El caracter de sustitución 4 es ignorado ya que no tiene correspondencia con ninguno de los caracteres del patrón (solo hay tres caracteres en el patrón). open(AR,'prueba.prb') || die "$!\n";
while (<AR>)
{
$_ =~ tr/tre/12/;
print ;
}
La salida por pantalla de este ejemplo es la siguiente:
122s p222os 122s ga1os y 122s 212fan12s.Este ejemplo es idéntico a el anterior pero en este caso sólo tenemos dos caracteres en la cadena de sustitución. Así, cuando el número de caracteres en la cadena de sustitución es menor que el número de caracteres del patrón, las ocurrencia de los caracteres del patrón que no tienen correspondencia con ningún caracter de sustitución, son intercambiados por el último de los caracteres de sustitución.
if($var =~ /^XXX/)
{
print $var;
}
if($var =~ /$END/)
{
$var; print
}
$var = '1sdffl3l54l6y547'; $var =~ s/[14]/X_X/g; $var; printLa salida por pantalla del ejemplo será la siguiente: X_Xsdff1315X_X6y5X_X7Cuando se utiliza el carácter ^ con los corchetes, queremos decir la no existencia de la cadena que está entre los corchetes. Así si nuestro ejemplo hubiese sido de esta manera: $var = '1s4s547'; $var =~ s/[^14]/X_X/g; $var; printla salida por pantalla sería la siguiente: 1X_X4X_XX_X4X_X $var =~ tr/[a-z]/[A-Z]/; /?{3}/
$var = 'Paco Gomez'; Manolo Gomez $var = '1flying burrito2'; XXXflying burritoXXXLos siguientes caracteres tienen un significado paralelo al anterior por lo que no se darán ejemplos de ellos: Los anteriores caracteres especiales, en su formato en mayúsculas significan lo contrario, esto es, \W expresa un carácter no alfanumérico, \D expresa un valor no numérico ... Por último el carácter \ permite referenciar un caracter especial en PERL como un carácter normal, así por ejemplo la siguiente sentencia: $var =~ s/\\d/XXX/g; nos permite sustituir todas las ocurrencias de la cadena \d por XXX. Si dentro de la expresión regular se hubiese escrito solo \d, la sustitución se realizaría en todos los valores numéricos. En general ocurre lo mismo con el resto de caracteres especiales de PERL.
Los operadores de repetición son los siguientes:
$var = 'EOflyingburritoEOEOEO'; $var =~ s/(EO)*$/XX/; print $var;La salida de este programa en PERL es la siguiente: EOflyingburritoXXComo se observa, ha sustituido un número indeterminado de ocurrencias de 'EO' al final de la cadena por una sola ocurrencia de la cadena 'XX'. Si no se hubiese utilizado el operador '*' junto con el carácter especial '$', la sentencia habría sustituido todas las ocurrencias de EO por XX. Como se observa en este ejemplo se utilizan los paréntesis para indicar que la operación de repetición afecta a la cadena EO por entero, de no haberse utilizado los paréntesis la repetición afectaría unicamente al carácter O.
$var =~ s/usted(es)?/---/;con esto conseguimos sustituir todas las ocurrencias de la cadena usted o ustedes por '---'.
$var = 'PERRO'; $var =~ s/(PERRO)/EL $1/; print $var;Como se observa utilizamos la referencia $1 para referirnos al primer patrón de búsqueda (la cadena `PERRO` en nuestro caso) dentro del apartado dedicado a los patrónes de sustitución, de modo que dentro de la sustitución se encuentra el patrón de búsqueda. Después de la ejecución la variable $var tiene la siguiente cadena: EL PERRO if( $var =~ /^(\w)+.*\1$/ );Esta expresión regular de comparación tiene el siguiente significado: mediante la cadena ^(\w)+ nos referimos a todos los caracteres alfanuméricos que forman parte del principio de la cadena contenida en $var, esto es, tomo como primer patrón todos los caracteres alfanuméricos de la cadena; con la cadena .* referencio un conjunto arbitrario de caracteres de longitud desconocida; con la cadena \1 expreso el primer patrón utilizado y con $ significo que este patrón debe de estar al final de la cadena contenida en $var. En definitiva la expresión regular tomará el valor cierto, cuando la cadena de caracteres contenida en $var tenga la misma cadena de caracteres alfanuméricos al principio y al final. Así por ejemplo, si $var tiene una cadena de caracteres como esta: 'hola juansdfa hola' el valor de la expresión regular será cierto, ya que los espacios en blanco no se consideran caracteres alfanuméricos. Ejemplo de uso de algunas funcionesA continuación se describen algunas de las funciones más utilizadas en la programación de un perl script, esto no pretende ser un manual de referencia luego para conseguir el formato puedes usar el comando man perl:
Última actualización: 2007-04-29 10:56:59-05 |
![]() Preparandome para el viaje a Puerto Vallarta... que triste... 3 hours, 4 minutes ago Du hast? 7 hours, 7 minutes ago Ich habe einen Kater, aber nicht so schlecht... 14 hours, 41 minutes ago Y yo un Abrazo. 1 day, 14 hours ago Dandole su habrazote a mi santa madre que me soporta 1 day, 16 hours ago esperando a que este el pozole 1 day, 17 hours ago Que estuvimos haciendo >> 10410 lecturas Sexualidad infantil y juvenil 9167 lecturas Anticoncepción de Emergencia 7840 lecturas Rompiendo cualquier clave WEP en unos pocos minutos 6921 lecturas Sinapsis y exocitosis 6227 lecturas Mi primer CakePHP, mmmmm cakeee 5264 lecturas Evolución filética en las hepáticas 4699 lecturas BASH y Primeros Comandos 4012 lecturas CakePHP II Active Record 3742 lecturas Cómo convertirse en hacker 3619 lecturas
|
| ||
| Crecí besando libros y pan... Desde que besé a una mujer, mis actividades con el pan y los libros perdieron interés. Salman Rushdie | ||
| Este trabajo está licenciado bajo la MonoNeurona Commons License. 2002-2008 © :: Colectivo MonoNeurona.org :: | ||