-=PERL=-

Iniciado por D4RIO, 20 Febrero 2008, 23:39 PM

0 Miembros y 1 Visitante están viendo este tema.

D4RIO

#-=PERL=-#

Bueno, vi el manual de Python de TxShack y me interesó su comentario acerca de Python vs Perl  :xD ... No te enojes, no es competencia, pero se me dio por hacer éste mini-manual de Perl ya que AMO a este lenguaje desde la primera vez que lo use...

Me interese por PERL cuando en uno de los conocidos manuales de hacking (mayormente) inofensivo leí la frase:

"PERL es el Lenguaje Amigo-Del-Hacker"

Desde entonces paso un largo tiempo hasta que agarré un manual de Perl... pero desde la primer aplicación no dejé de usarlo compulsivamente hasta hoy.

Creado en 1987 por Larry Wall como herramienta que llenaba los huecos dejados básicamente por AWK y SED. Ha influido a Python, PHP, Ruby, ECMAScript entre otros, corre en gran cantidad de Sistemas Operativos, se distribuye bajo la Licencia Artística o bajo la GPL.

Quisiera agregar que NO Abarcare todo el lenguaje ni sus trucos ni mucho menos, ya que Perl es uno de los lenguajes más extensos que conozco. En todo caso, hay interminable documentación incluida en perldoc (y cuando digo interminable hablo en serio).

Perl es un lenguaje complejo, MUUUY AMPLIO que ofrece un sinfin de posibilidades de las más variadas.

Para que sirve PERL?:
No es por ser mala onda pero si todavía tenés ésta duda ¡LEE LO ANTERIOR! - Perl sirve prácticamente para todo lo que desees. La inmensa cantidad de módulos que se han programado para Perl lo hace un lenguaje Amplio y Ampliable.

Pero a todo ésto ¿Como es PERL?:
Su sintáxis es muy similar a la de C, pero  a diferencia de éste, Perl no es tan estructurado, y yá en éste punto es necesario mencionar el lema de Perl : "SIEMPRE HAY MÁS DE UNA FORMA DE HACERLO"... y eso es marca registrada. Cuando escribes Perl puedes elegir entre miles de formas de hacer lo mismo.
Otra cosa a saber es que "SEGURAMENTE ALGUIEN YA HIZO UN MÓDULO PARA LO QUE NECESITO".
Perl es un lenguaje muy extensible y es en gran parte gracias a los módulos. No veremos ahora esa parte específicamente, pero basta saber que los módulos nos facilitarán la vida muchísimo, al punto que ejecutar comandos en una máquina remota se vuelve cuestión de unas cuantas líneas... creando una conexión en unas eficaces dos o tres líneas ( o_O ).
Empecemos por una básica comparación C - C++ -Perl :

Hola mundo en C
#include <stdio>

int main(void)
{
    printf("Hola Mundo!\n");
}


Hola Mundo en C++
Código (cpp) [Seleccionar]
#include <iostream>

int main(void)
{
    cout << "Hola mundo!\n";
}


Hola Mundo en Perl
Código (perl) [Seleccionar]
print "Hola Mundo\n";

O bien podemos usa el SheBang para invocar al interprete de Perl, o bien para invocar una versión específica, o pasar parámetros a dicho intérprete en caso de querer que sea ejecutado de otra forma, o bien muchas cosas que pueden ver en la página correspondiente de perlrun, aqui: http://perldoc.perl.org/perlrun.html#DESCRIPTION

Y empiezan nuestras posibilidades ilimitadas con Perl... ya que podríamos usar éste modo:

Código (perl) [Seleccionar]
#!/usr/bin/env perl -W
use strict;
print "Hola mundo!\n";


Y entonces introduciríamos el control de calidad del pragma strict, con el que, por ejemplo, no podremos inicializar una variable sin usar my.

CitarEn general lo que hace la directiva sctrict es generar errores al programas en caso de que se encuentre lo que pueda considerar "programación insegura"

A demás usamos el parametro -W con lo que activamos todas las advertencias (Warnings).

Pueden encontrar mucha información de PERL en wikipedia...


UNA INTRODUCCION

Pero empecemos con algo útil... una de las mayores capacidades de Perl es Escribir y Leer ficheros (Aunque no haya sido su significado desde un principio, actualmente Perl se conoce por las siglas Practical Extraction and Report Language... a tal punto que es la cabecera de su página de manual de Unix)

Para abrir un fichero en Perl hay que usar open()... y otra vez, recuerden que HAY MAS DE UNA FORMA DE HACERLO, tal es así que entre la documentación de perl encontramos una página llamada perlopentut en la que encontraremos muchos trucos acerca de la apertura de ficheros. Para usuarios de sistemas Unix (ej: Linux) pueden abrir una terminal y escribir perldoc perlopentut. Usuarios de debian o sistemas similares (ej: ubuntu) necesitaran instalar el paquete perl-doc
lo cual pueden hacer mediante el comando sudo apt-get install perl-doc.
Pueden ver una lista de la enorme cantidad de documentacion disponible con el comando man perl o perldoc perl.

NOTA: Perl es una herramienta diseñada para sistemas UNIX aunque hoy en día soporta múltiples plataformas. Para correr Perl debes tener instalado el intérprete de Perl. Puedes visitar www.perl.com o www.perl.org para ver lo referente a tu sistema operativo. La documentación del comando perldoc incluye notas para muchos sistemas distintos, ver la lista en perldoc perl

Pasemos al grano:

UNA FORMA DE ABRIR Y ESCRIBIR UN FICHERO EN PERL:
Código (perl) [Seleccionar]
#!/usr/bin/perl -W

# Esto es un comentario, lo que viene es la variable con la ruta...

my $Ruta_Fichero="/home/d4rio/perlscripts/utils/escribime.text";

# Ahora abro el fichero para escribirlo...

open IDENTIFICADOR "> $Ruta_Fichero";


Hasta ahi es suficiente para que expliquemos algo:: lo que sigue a open es el identificador del fichero (filehandle). Usaremos ese identificador para referirnos al fichero abierto en adelante. El signo ">" que usamos significa que escribiremos en el fichero. Es simple, se usan las mismas notaciones que usaríamos en la consola, por ejemplo, en una consola de UNIX, ésto:

Código (bash) [Seleccionar]
echo "Escribo algo" > nombre_de_fichero;

...sería mandar la salida de ese comando a "nombre_de_fichero"... pero NO CONTINUANDO. En DOS o la consola de Windows es igual:

Código (dos) [Seleccionar]
echo "Hola, como andan?" > archivo.txt

...escribiría "Hola, como andan?" en el fichero "archivo.txt" pero NO CONTINUANDO

NOTA: Con "NO CONTINUANDO" me refiero a que si el archivo contenía algo será borrado en vez de continuar al final del fichero.

Para abrir un archivo se pueden usar varios modos:

Modo de lectura: Lee el fichero<
Modo de escritura: Sobreescribe el fichero (si habia algo lo borra)>
Modo de escritura: Escribe al final del fichero>>

Pero se puede usar una tubería para pasar la salida de un comando a nuestro programa como si leyeramos un fichero, o bien pasar todo lo que escribamos en el identificador a un comando.
Si desean ver los miles de usos de open vean perldoc perlopentut

Ahora iremos pidiendo los datos de una persona y al final los meteremos en un fichero:

Código (perl) [Seleccionar]
#!/usr/bin/env perl

# PIDO LOS DATOS
print "Hola, necesito que me des unos datos...\n\n";
print "Nombre: ";
chop($NOMBRE=<STDIN>);
print "Apellido: ";
$APELLIDO=<STDIN>;
chop($APELLIDO);
print "\n";

# ABRO EL FICHERO
open (MI_LOG, ">", "/home/d4rio/perlscripts/utils/profile.nada") or die "NO SE PUEDE CREAR EL FICHERO!\n";

# ESCRIBO
print MI_LOG "Nombre: $NOMBRE Apellido:$APELLIDO\n";

# CIERRO EL ARCHIVO
close MI_LOG;


Como ven incluimos otra forma de abrir el fichero (que consume unos bytes más de memoria), y la capacidad de procesar un error (NO SE PUEDE CREAR EL FICHERO)...

Vemos tambien chop() que es una funcion para quitar el último carácter, que es en general el retorno de carro y por eso siempre se quita. Tambien vemos cómo asignar a una variable el valor introducido en la Entrada Standard (<STDIN>).

Como verán es un lenguaje muy flexible, y eso que todavía no vimos nada más que una introducción. Ya veremos otras capacidades de Perl, como la gran facilidad para manejarnos con conexiónes a Internet, pero no alcanzaremos a contemplar toda la capacidad de éste lenguaje, como Interfaces gráficas con Qt, interacción con OLE en Windows, capacidad de manejar imágenes, actuar como CGI en programación web, Tratar con bases de datos, etcétera...

BUENO, ësta fue la INTRODUCCION A PERL }=) ::.
En otra ocasión nos adentraremos en éste vasto lenguaje, el LENGUAJE-AMIGO-DEL-HACKER.
OpenBSDFreeBSD

D4RIO

PERL I OverView y Bases

Perl es un lenguaje muy completo y resulta dificil describirlo. No establece ninguna filosofía de programación concreta. No se puede decir que sea
orientado a objetos, modular o estructurado aunque soporta directamente todos estos
paradigmas y su punto fuerte son las labores de procesamiento de textos y archivos.

Perl no es un lenguaje compilado ni tampoco interpretado, es un híbrido como Java aunque su comportamiento es totalmente diferente.
El código de Perl se compila a un código interno para guardarse en memoria, que se optimiza como si hicieramos un programa ejecutable, pero a diferencia de cualquier programa ejecutable independiente, el código interno de Perl no puede ser ejecutado directamente por el sistema operativo, sino que debe ejecutarse por un Motor, como si fuese interpretado. Así vemos que en realidad Perl es un híbrido.

VARIABLES:
Desde un punto de vista generalizado las variables son prácticamente cualquier estructura a la que se le pueden asignar datos, por eso definiremos como variable también a los arrays (matrices) y hashes (matrices asociadas), a demás de las comunes variables escalares (se llaman así porque no son vectoriales ;) )

Variables Escalares:
Son las variables que sólo contienen un valor, sea numérico o alfanumérico y se comienzan con "$", Las variables de contenido alfanumérico deben encerrarse entre comillas dobles ("") y como siempre en Perl, al terminar una sentencia se usa ";" (punto y coma).
Ejemplos:
Código (perl) [Seleccionar]
#Alfanumericas
$Variable1="Hola";
$Variable2="Mundo";
print "$Variable1 $Variable2";

Código (perl) [Seleccionar]
#Con decimales y notacion cientíafica =P
$ConDecimales=1,2;
$ConNotacion=2,3E4;
$MAL="3,4";  #<- Esto no es un numero sino un alfanumerico
$Hexadecimales=0x1A;
$Octales=038;


Así también podemos hacer asignaciones entre variables, recordando que el operador asignacion significa SIEMPRE que el segundo valor reemplazará al primero, por ejemplo:

$VarB=$VarA;

El contenido de la variable VarB SE PERDERA y se reemplazará por el contenido de VarA. Eso viene desde las bases de los lenguajes de máquina y se repite en todos los lenguajes. Si lopensamos en función de posiciones en la memoria veremos que:

A=B

Significa que el contenido de la posicion B se asignará a la posicion A, borrando todo lo que exista allí. En Perl es algo diferente ya que podemos hacer asignaciones entre diversos tipos de variables, lo que significa que en memoria ésto se tratará de manera diferente ya que a bajo nivel no está permitido asignar una variable de un tipo a una de otro tipo (Programadores de Assembly o lenguajes como C me entenderán).

ASIGNAR E INTERPOLAR:
Podemos usar variables para crear otras variables interpoladas. Eso nos facilita procesar y mostrar la información de manera sencilla. Para hacerlo en C o C++ deberíamos usar algunas formas específicas, igual en lenguajes como pascal e incluso en lenguajes sencillos como javascript, debemos inteerpolar usando construcciones como:

Código (javascript) [Seleccionar]
var Nueva='Hola don '+Nombre+', esperamos disfrute su visita...\n';

Sin embargo en Perl es mucho más sencillo, veamos:

Código (perl) [Seleccionar]
$Apellido="Perez";
$Mensaje="Hola don $Apellido, esperamos disfrute su visita\n";


Así de sencillo.

ADICION Y CONCATENACION CRUZADA:
En Perl una variable alfanumérica puede actuar como numérica o viceversa. Al realizar operaciones de éste tipo debemos usar éstas formas con los operadores "+" y ".".

Código (perl) [Seleccionar]
$NUMERO=2;
$ALFANUM="3";

# Sumar numero más alfanumérica
$SUMA=$NUMERO+$ALFANUM;  # Es Faaacil XD - $SUMA ahora vale 5

#Concatenar un número y una cadena
$CONCAT=$NUMERO.$ALFANUM;  # Ahora $CONCAT vale "23"


Ésto nos permite obtener un valor desde una cadena (pe: Leyendo un fichero) y usarlo para operaciónes matemáticas, para después devolverlo a una cadena de salida xD.

Una operación más avanzada es la asignación múltiple de variables. Con este método podemos realizar varias asignaciónes juntas, evitando renglones que dificulten la lectura del código.
Pe: Ésta asignación...

Código (perl) [Seleccionar]
$Var1=$NUMERO;
$Var2=$ALFANUM;
$Var3=$OTRA_VARIABLE;


Se puede hacer mucho más simple así:

Código (perl) [Seleccionar]
($Var1,$Var2,$Var3)=($NUMERO,$ALFANUM,$OTRA_VARIABLE);

Observen que se usan paréntesis () que no se ven muy bien con el resaltado, y los valores se separan con comas ",".

Variables de Matrices (Arreglos, Vectores, Arrays):
Éste tipo de variables es en realidad una matríz de variables. Para aquellos que no conozcan lo que son vectores o matrices, imagínenlas como listas en las que cada objeto listado es una variable.
Los Arrays () o matrices se definen usando el carácter "@" (arroba).
Veamos un ejemplo en el que definiremos una matríz de 3 valores.

Código (perl) [Seleccionar]
@Animales=("Perro", "Gato", "Caballo");

Así accedemos a los valores por referencia, comenzando desde 0 (cero) y, en éste caso, hasta 2 (dos). Vamos a mostrar la lista por la pantalla.

Código (perl) [Seleccionar]
@Animales=("Perro", "Gato", "Caballo");
print "Primer valor - $Animales[0]\n";
print "Segundo valor - $Animales[1]\n";
print "Ultimo valor - $Animales[2]\n";


Éste código puede ser muy mejorado si usamos un bucle, pero eso lo veremos más adelante.
Podemos introducir variables o matrices dentro de una matríz:

Código (perl) [Seleccionar]
@Anim1=("Perro", "Gato", "Caballo");
$OTRO="Ornitorrinco";

@Animales=(@Anim1,$OTRO,"Jirafa","La suegra");


Ahora veamos los métodos clásicos de operación de los Arrays, que son métodos que nos facilitan operar con los elementos de un array.

PUSH:
Sirve para colocar un elemento al final de la matríz, y se usa así:

push(@matriz, "Valor")

@matriz es la matríz en la que queremos introducir el "Valor". Éste valor puede ser un número, una variable escalar, u otra matríz.
Un Ejemplo:
Código (perl) [Seleccionar]
@Matriz=("Uno", "Dos");
@OtraMatriz=("Tres", "Cuatro");
push(@Matriz, @OtraMatriz);


POP:
Quitar el último valor de la matríz. Aplicado a la matríz anterior quitaría el valor "Cuatro", y lo devuelve, por lo que lo podemos meter en otra variable. Veamos;
Código (perl) [Seleccionar]
$ValorSacado=pop(@OtraMatriz);
print "Saque el valor $ValorSacado\n";

Ahora quedan los valores "Uno" "Dos" y "Tres".

UNSHIFT:
Nos permite reemplazar el primer valor de una matriz, aplicado a la matriz anterior sería:
Código (perl) [Seleccionar]
unshift(@Matriz, "Unito");
Cambiaría el "Uno" por "Unito".

SHIFT:
Quita el primer valor de la matriz, desplazando a los demás un lugar, por ejemplo:
Código (perl) [Seleccionar]
shift(@Matriz);
Dejaría los valores a partir de "Dos" y sacaría el "Unito". Tal y como POP , éste método devuelve el valor sacado de manera que lo podamos usar.

Podemos conocer el último índice de un array usando una notación especial, el "$#". Por ejemplo si quisieramos conocer cuál es el último índice de nuestra matríz sería:
Código (perl) [Seleccionar]
$ULTIMO_INDICE=$#Matriz;

Variables de Matrices Asociadas o Hashes:
Éste último tipo es conocido como tablas de hash y se notan con el símbolo "%". Es similar a las matrices comúnes pero cada valor se referencia por una clave, que es una palabra, y no por un número. Hay dos modos de inicializar el hash, donde la primera es poco visible.Veamos un ejemplo:
PRIMER CASO
Código (perl) [Seleccionar]
%Numeros(Uno, 1, Dos, 2, Tres, 3, Cuatro, 4);
SEGUNDO CASO
Código (perl) [Seleccionar]
%Numeros(
        Uno=>1,
        Dos=>2,
        Tres=>3,
        Cuatro=>4
);

En ambos casos las claves son Uno, Dos, Tres y Cuatro, pero el segundo es más visible. Ahora para referenciar los valores usamos llaves en vez de corchetes, y claves en vez de números, así:
Código (perl) [Seleccionar]
$Numeros{Dos}; # Nos da el 2
Y podemos asignar valores de a uno así:
Código (perl) [Seleccionar]
$Numero{Uno}=9; # Cambia el 1 por un 9;
$Numero{"tres"}=50; # Tambien se pueden usar comiilas dobles.


Como los Arrays, los Hashes tienen sus métodos para operar de diferenctes maneras con ellos:

delete($matriz{clave})
-Borra EL PAR COMPLETO clave/valor del hash..

values(%hash)
-Muestra LOS VALORES del hash (no las claves) SIN ORDENARLAS.

keys(%hash)
-Muestra LAS CLAVES de un hash.

each(%hash)
-Muestra solo un par clave/valor del hash que pusimos como parámetro.

exists $hash{clave}
-Si existe la clave en el hash %hash la funcion devuelve 1.

defined $hash{clave}
-Si la clave existe o simplemente está definida, devuelve 1.

Existe una función extra que podemos usar como filtro para ordenar valores: sort.
Por ejemplo, si queremos mostrar las claves de un hash de forma ordenada debemos usar:
Código (perl) [Seleccionar]
print sort(keys(%hash));

Esto culmina nuestro primer capítulo. Ahora sabemos las bases de Perl, y podemos comenzar a trabajar con ficheros y tratamientos para darnos cuenta de cuántas utilidades le podemos dar a éste lenguaje.
OpenBSDFreeBSD