Curso de Perl desde 0
by Vengador de las Sombras
by Vengador de las Sombras
________________________________________
Curso de Perl desde 0
Por Vengador de las Sombras
Saludos!
Incio este curso de perl desde cero con el objetivo de adentrar a la gente en el maravilloso mundo de PERL, un lenguaje extremadamente sencillo, versátil y al que se le puede sacar mucho jugo. Antes que nada hacer una pequeña introducción al curso, diciendo que las extensiones de los archivos con los que vamos a trabajar tienen como extensión .pl . Para poder comenzar el curso, necesitaremos de un intérprete de PERL. En mi caso, os recomiendo utilizar ActivePerl, encontrareis manuales a patadas por Google. Para "ejecutar" nuestro .pl deberemos de situarnos en el directorio donde lo tenemos y teclear:
Citar
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
V3NG4D0R C0MM4ND3R L1N3: Perl ARCHIVO.pl
(C) Copyright 1985-2001 Microsoft Corp.
V3NG4D0R C0MM4ND3R L1N3: Perl ARCHIVO.pl
________________________________________
Todos nuestros programas en perl los iniciaremos con una línea que se usa como standar para identificar que se trata de un source en perl (en realidad en máquinas basadas en Unix se utiliza para indicar el lugar del intérprete, así que en Windows puede sobrar, pero siempre es bueno ponerlo para aclarar). La línea en cuestión es:
Código:
#!/usr/bin/perl
Cuando una línea se inicia con el carácter #, se le indica al intérprete que ignore esa línea. Es usado para introducir comentarios aclaratorios dentro del programa, realizando la misma función que "rem" en batch.
Bien, lo siguiente que se ve en un lenguaje es cómo imprimir por pantalla líneas de texto. En PERL la función encargada (a la larga veremos otra función más tipo C) es print. Su sintaxis es muy sencilla:
Código:
print "Texto";
Fijémonos en un detalle fundamental, al acabar cualquier funcion/sentencia siempre debemos de poner ; para indicar que finaliza. Existen funciones de escape indicadas con \letra. Nosotrs las iremos estudiando conforme las necesitemos. Por ahora sólo teneis que aprenderos el salto de línea (que es igual que en el resto de lenguajes de programamción), es \n.
Entonces un programa simple, el típico Jelou Güorld (como diría Seth) sería algo tipo:
Código:
#!/usr/bin/perl
print "Jelou";
print "\nGuorld";
Cuando se desea imprimir varias líneas de texto se recurre a print q( TODO EL TEXTO);. Cuando se imprime así, no es necesario recurrir a los caracteres de escape, ya que en el output (lo que sale por pantalla) aparece tal y como lo escribamos. Para que se entienda mejor, aquí dejo la cabecera de un programa que codee la otra noche:
Código:
print q(
=====================================================
HTTP HEADER F.o.S. Injector v0.0
Priv8 Edition-Cod3x by Vengador de las Sombras
&
Mace Windu & Chipbios
Gr3tz to: WaesWaes, Plaga, Lutscher, Harakiri, Phonix
=====================================================
);
Las variables....
Si bien voy a intentar apotar a este curso desde cero todo lo que sé sobre variables, cómo usarlas, etc... no lo voy a hacer a saco, puesto que como he dicho este es un curso desde "0" enfocado a NW's en la materia. Es por ello que si voy a saco hablando de variables locales y globales (hablando de variables de ambiente), hashes, arrays y demás seguro que me matais XD :6:. Así que a lo largo del curso iremos aumentando progresivament e la dificultad del contenido XD, es decir, que empezemos por lo básico .
Parto de la base de que como mínimo la gente que está leyendo este tutorial ya habrá visto pseudolenguaje s tipo "Batch", y estará familarizado con qué es una variable, así que sin más problemas nos metemos a hablar de ellas .
Las variables en PERL vienen señalizadas con el carácter $ (Como en casi todos los lenguajes, vamos XD). Pueden contener desde strings (Cadenas de caracteres) hasta números con los que operar (las llamadas variables escalares). La ventaja de PERL es que el manejo de variables, en mi opinión, es sencillo, ya que te permite colocarlas en casi cualquier parte del source de nuestro programa, sin necesidad de declararlas desde un inicio, como pasa en otros lenguajes.
La forma más simple de "setear" (a partir de ahora voy a usar ese término para referirme a introducir un valor a una variable) una variable es colocando el mítico $variable = 5;. Una cosa a tener encuenta para evitar posibles errores, es que las variables en PERL son case-sensitives (creo que se decía así), es decir, son sensibles a mayúsculas y minúsculas. Por ende, no será lo mismo $Var que $VAR, ni que $var.
Las variables pueden ser utilizadas en operaciones aritméticas de forma simple, usando los caracteres encargados de ello. Las operaciones aritméticas (existen aritméticas y lógicas) que se pueden realizar las dejo en el siguiente cuadro:
_________________________
OPERACIÓN l CARACTER
_________________________
Suma +
_________________________
Resta -
_________________________
División /
_________________________
Multiplicación *
_________________________
Potencia **
_________________________
Módulo %
_________________________
Hay más, pero con estos nos apañamos por ahora.
Un ejemplo aclaratorio:
(ejemplo)
Código:
#!/usr/bin/perl
# Ejemplo de Aritmética
$var = 1;
$var2 = 3;
$resultado = $var + $var2;
$modulo = $resultado % 2;
print "El resultado de todas las operaciones es:\n\n\n $modulo";
exit(0); # Funcion de finalización
Siendo el output (Salida por consola) esto:
: Output
Citar
V3NG4D0R C0MM4ND3R L1N3: perl a.pl
El resultado de todas las operaciones es:
0
El resultado de todas las operaciones es:
0
Alejándonos de la aritmética, pero sin abandonar a nuestras amigas las variables, vamos a ver cómo meter cadenas de texto dentro de una variable. Para realizar esto, simplemente debemos de entrecomillar el String a almacenar en nuestra variable. Es decir, quedaría así:
Código:
$texto = "FoS RoolZ!";
Cabe destacar que se puede interpolar una variable dentro de otra cadena de texto (no confundir con concatenar), es decir, si hacemos algo tal que así:
Código:
$var = "FoS";
$Todo = "$var TeaM Rocks!";
#$todo valdría FoS TeaM Rocks!
En PERL hay existen dos formas de entrecomillación, la vista hasta el momento, usando "contenido" y otra usando las comillas simples, es decir, 'contenido'. La diferencia entre ambas, es que de la segunda forma toma todo de forma "literal", es decir, usando el anterior ejemplo pero con comillas simples:
Código:
$var = "FoS";
$Todo = '$var TeaM Rocks!';
________________________________________
Bueno, hasta aquí el capítulo de Hoy. Creo que es una buena introducción a las variables, aunque me he dejado en el tintero ciertas cosas, como las variables implícitas $_ , los argumentos y cosas así, pero ya se verán en próximos capítulos.
En el capítulo anterior ya empezemos a trabajar con variables, en este nuevo capítulo vamos a seguir viendo un poco más del tema de las variables.
Hasta este momento, la única forma de asignación de variables es colocandolo intrínsecamente dentro del código fuente de nuestro programa. Lo que vamos a hacer a continuación es exponer dos modalidades diferentes de introducir valores en variables, el primero a través del teclado y la segunda a través de "argumentos" que se introducen de forma externa.
Para introducir un valor a través del teclado se utiliza la expresión <STDIN>. No existe ningún misterio de como hacerlo, puesto que únicamente hay que poner <STDIN> como valor de la variable que deseamos rellenar a través del teclado. O sea, que quedaría algo tipo:
$variable=<STDIN>;
Como habeis observado, la simplicidad del método implica que no tengamos que expandirnos mucho en la explicación de este tema... Así que simplemente deciros que antes de la asignación de la variable, recomiendo poner un print que indique qué contenido debe de tener la variable:
Código:
print "[?] Edad:\n";
$edad=<STDIN>;
print "[+] Tu edad es $edad"
Captado el concepto, pasamos a algo más interesante: los argumentos. Los argumentos son variables las cuales tienen todas la misma composición: $ARGV[X]. Donde "x" es un número natural (entero positivo).
Las variables argumentales ("Argumentos") se pasan al programa a través de la shell, de la siguiente forma:
Perl programa.pl [Argumento 0] [Arguemento 1] .... [Argumento X]
Cada una de las palabras que se expresan a continuación (y separadas por espacios) del programa son los valores que tomarán las diferentes variables. Las variables se expresan con $ARGV[], colocando entre corchetes el número de argumento (el primer argumento es el 0). Entonces, podemos visualizar el siguiente ejemplo:
Código:
#!/usr/bin/perl
print "Te llamas $ARGV[0] , tienes $ARGV[1] años";
exit(0)
Si invocamos este programa desde línea de comandos:
Citar
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
Fl4mm1ng 0ur Sk1llZ: perl ejemplo.pl Vengador 16
(C) Copyright 1985-2001 Microsoft Corp.
Fl4mm1ng 0ur Sk1llZ: perl ejemplo.pl Vengador 16
Las variables asignarán la palabra(0) (vengador) a la variable $ARGV[0], y con el otro argumento igual.
Existe una variable, la cual indica el número de argumentos que hemos introducido, ésta @ARGV. Lógicamente sólo expresará valores enteros positivos.
Continuemos...
Vamos a dejar por un tiempo las variables, para entrar en otros temas, pero no nos olvidamos definitivament e de ellas, puesto que ampliaremos más adelante. Hago esto para no agobiaros todo el rato con el mismo tema newrussian .
Entonces, lo que tenía pensado hacer hoy es introduciros en las funciones de control de flujo. Estas funciones se encargan de ejecutar un grupo de sentencias cuando se alcanza cierta condición. Las condiciones pueden contener operadores lógicos, como ya veremos más adelante. Algunas de estas funciones son IF (con Elseif en anidamientos, y Else), While, Do-Until, Unless, For y cosas por el estilo. Empezaremos estos días a ver los más simples.
Para empezar, os explicaré qué es un bucle o loop. Son conjuntos de sentencias que se ejecutan un número de veces definido por una condición, y esta condición es procesada por una sentencia de control de flujo. Existen dos tipos principales de bucles, los finitos y los infinitos.
Los finitos son aquellos grupos de sentencias que se repiten de forma reiterativa hasta que una condición se vuelve TRUE o FALSE, según se haya definido. Por contraposición, los bucles infinitos son aquellos que se repiten sin parar.
El primer tipo de sentencia para realizar bucles es Do. La sintaxis de Do es muy sencilla:
Citar
DO {
.............. ....
.............. ..
.............. ..
(Sentencias)
.............. .......
.............. ..........
} until (condición);
.............. ....
.............. ..
.............. ..
(Sentencias)
.............. .......
.............. ..........
} until (condición);
Traducido al castellano, el código vendría a significar:
"Hacer estas sentencias hasta que pase esto".
Ahora quiero comentaros un tipo de operación aritmética que antes no comenté, los incrementos y decrecimientos . Esta operación aritmética consiste en aumentar o disminuir 1 a 1 una variable que contiene un valor entero. Se expresan de la siguiente forma:
$variable++ Para sumarle 1
$variable-- Para restarle 1
Os explico esto, para proponeros el primer ejemplo sencillito de bucle Do-Until:
Código:
#!/usr/bin/perl
$variable = 0;
do
{
$variable++
print "\nLa variable vale $variable";
} until ($variable eq "15");
exit(0);
Eq significa "igual a". tambien se puede expresar como ==. Cuando tenga un ratejo continúo con el manual y completo con todos los operadores lógicos y explico cada uno, a parte veremos la primera parte de if (ya que if tiene muuuuuuucha tela que contar, aunque parezca que no.).
Tras un breve periodo sin conexión a internet por problemas ajenos a mí (pvtas líneas y pvta timofónica) podemos seguir con el curso...
Creo recordar que lo dejemos cuando empecemos a ver las estructuras de control... Hoy vamos a centrar nuestra atención en las estructuras condicionales, usando IF, ELSE, ELSIF y UNLESS.
El tipo más simple de condición se desarrolla utilizando la sentencia IF, cuyo uso más simplificado es if (condiciones) { Grupo de Sentencias } . Dentro de las condiciones que han de darse para que se ejecute el grupo de sentencias delimitadas por { y }, podemos encontrar dos tipos. Por un lado las condiciones basadas en variables numéricas estrictas, y cuyas operaciones lógicas permitidas son:
== igual que...
!= distinto de...
< menor que...
> mayor que...
>= mayor o igual que...
<= menor o igual que...
Al mismo tiempo, estas condiciones se complementan con otras a través de otras operaciones lógicas, como pueden ser and (&&) y or (||). La operación AND sirve para que dos o más condiciones se tengan que dar, en cambio, la operación lógica OR, implica que si no se cumple una condicion, pero se cumple otra, se puedan ejecutar el grupo de sentencias. Un ejemplo para asimilar esto, pudiera ser:
Código:
$variable=<STDIN>;
if ($variable > 15 && $variable < 30) {
print "El número está entre 15 y 30";
}
exit(0)
El otro tipo de condiciones son aquellas cuyas variables no son estrictamente numéricas, sino que pueden estar compuestas por grupos de caracteres alfanuméricos. Para este caso, los operadores a utilizar son:
Código:
- eq igual que...
- ne distinto de...
- lt menor que...
- gt mayor que...
- ge mayor o igual que...
- le menor o igual que...
En este caso, con lo que se compare se deberá de poner entrecomillado . Hasta ahora hemos visto cuando la condición que se cumple es "verdadera", pero ¿Y si la condición "no se cumple"?. Para esto disponemos del condicional unless, cuya sintaxis es idéntica al del IF.
Con IF podemos tambien comprobar si una variable está definida (o como yo suelo decir "seteada"), para ello el código sería if ($variable){ SENTENCIAS} . Igualmente encontramos el caso contrario, si no está definida una variable debemos de añadir un ! delante de la variable, quedándonos algo tipo: if (!$variable){ grupo de sentencias }. Esto último tambien podemos realizarlo con UNLESS: unless ($variable){ Sentencias}
Sigamos con IF....
Si usasemos únicamente IF como condicional, el programa que generásemos sería demasiado estricto y probablemente contendría bastantes bugs y código basura que aumentarían en bastante el peso. Esto sería debido a que únicamente podemos concretar una condición por cada IF, pero... ¿Y si necesitamos que el flujo se bifurque cuando no se cumpla la condición?.
Para este caso podemos montar otra estructura de control basada en IF y ELSE. Else va a ser como "Si no se cumple esta condicíón, haz este grupo de sentencias". En cuanto a su sintaxis, es de suma sencillez, veámosla con un ejemplo:
Código:
print "Introduzca su edad";
$edad=<STDIN>;
if ($edad >= 18){
print "\nEres Mayor de Edad";
else {
print "\NEres Menor de Edad";
}
Dentro de un IF pueden encontrarse múchos más IF y ELSES.
Bien... pero... y si necesitamos bifurcar un flujo ante tres condiciones diferentes ? Para esta función existen los llamados "anidamientos". Son estructuras que consisten en usar un paso intermedio entre IF y ELSE: elsif. Elsif viene a ser como "Haz esto si la condición de arriba es False y esta es True". Podemos poner tantos elseif como queramos dentro del código fuente:
Código:
if (Condicion){
Setnencias
}
elseif (Condicion){
Sentencias
}
elseif (Condicion){
Sentencias
}
else {
Sentencias
}
De IF todavía quedan cosas que contar, pero lo vamos a dejar aparcado para el próximo día hablar sobre otras estructuras de control
Bueno... sigamos por donde lo dejemos....
El último día dije que ibamos a ver alguna otra estructura de control, y eso es lo que haremos. Hoy le toca a while.
While se utiliza para formar estructuras muy simples, cuyo funcionamiento es que se ejecute un grupo de sentencias mientras (while) una condición determinada sea TRUE. Entonces la cosa sería algo tipo:
Código:
while (condicion) {
sentencias a ejecutar
}
Cuando la condición de while se vuelva FALSE, el bucle finalizará y dará paso a las siguientes sentencias que haya por debajo de éste.
Un sencillísmo ejemplo sería:
Código:
while ($variable < 5){
$variable++;
print "\n$variable";
}
Normalmente while yo lo suelo usar mucho cuando trabajo con sockets. Bueno, otro bucle que es muy usado en PERL (Y en casi todos los lenguajes) es FOR.
La estructura de for es muy simple, for(valor_incial,Valor_final,cambios){ stnencias}
Es muy simple, con un ejemplo se ve claro:
Código:
for ($var=1,$var<=5,$var++){
print "$var\n";
}
¿Simple no? La variable $var va a tomar valor "1", y va a ir aumentando de uno en uno mientras que sea inferior o igual a 5. Una cosa que no se suelen explicar en los manuales, es el uso de next y last dentro de estas estructuras repititivas.
Usando IF y NEXT podemos hacer que cuando $var cumpla X condición, no se ejecute el grupo de sentencias, y con if y last, lo que podemos hacer es que se ejecuten las sentencias hasta que se cumpla X condición. Un ejemplo sería:
Código:
for ($var=1,$var<=5,$var++){
if ($var == 2){
next;
}
print "$var\n";
}
Y este otro:
Código:
for ($var=1,$var<=5,$var++){
if ($var == 2){
last;
}
print "$var\n";
}
Bueno... hasta aquí la parte de hoy... el próximo día empezaremos a ver el manejo de archivos... byt3z...
Para lo que el manejor de archivos, vamos a necesitar de la sentencia open(), la cual usaremos de la siguiente forma:
Citar
open(LOGICO,"indiFISICO);
Lógico hace referencia al soporte lógico que se forma con el archivo, es decir, cada vez que realicemos una operación a LOGICO, se la estaremos haciendo al fichero (que de no existir, lo crearemos). En indi se coloca < si lo que queremos es leer el archivo FISICO, > si queremos crear el archivo FISICO. En caso de usar >, si el fichero FISICO existe, se sobre escribe en él con el último puntero. Despues nos encontramos >> que escribe en el archivo FISICO pero dejando el puntero debajo de lo que ya existía, con lo que no sobreescribimo s el archivo.
Y por último FISICO es el archivo, por ejemplo archivo.txt, index.htm, virus.bat, etc.
Bien ahora ya sabemos como hacer referencia a los archivos, en las distintas formas que vamos a necesitar (lectura y escritura).
Ahora, cuando queramos realizar operaciones con nuestro fichero abierto, tendremos que hacerlos sobre lo que hemos denominado LOGICO. Esta debe de ser una palabra escrita en mayúscula. Cuando terminemos de realizar las operaciones sobre nuestro fichero debemos de cerrarlo, para ello tendremos que usar la función inversa: close(). Tenemos que poner dentro de () el nombre lógico del archivo que estamos manejando, ergo close(LOGICO);.
Pero todo esto está muy bien... Pero... ¿Cómo puedo operar dentro de un fichero?
Sencillo, si abrimos un archivo en modo Lectura, lo único que podremos hacer es leer las lineas que contiene. Para realizar esto podemos valernos de un bucle foreach :
Código:
#!/usr/bin/perl
open(FILE,"<archivo.txt");
@source = <FILE>;
foreach $linea (@source){
print $linea;
}
close(FILE);
Con @source lo que hacemos es volcar el contenido de archivo.txt dentro de este arreglo (ya veremos en otra ocasión que es esto). Despues vamos linea por linea viendo el contenido de archivo.txt, y cada linea queda guardada en $linea y es imprimida por pantalla.
Este sería un ejemplo muy sencillo para poder leer un fichero. Para escribir dentro de un archivo, sólo tenemos que hacer print al soporte lógico:
Código:
#!/usr/bin/perl
open(FILE,">archivo.txt");
while ($contador >= 5){
$contador++;
print FILE "Nuestra linea numero $contador\n";
}
close(FILE);
exit(1);
Bueno me sirvió de mucho este curso. aunque no llegó a su final.. cuando sea completado lo postearé..
portalhacker(.net)
Citar
Proximo día sockets "light" (sin complicaciones, que ya habrá tiempo de usar sockets al estilo "complejo").