Copy Link
Add to Bookmark
Report

4x06: Perl for Panas (1/3)

eZine's profile picture
Published in 
0ri0n Team Venezuela
 · 1 month ago

-[ 4x06.txt ]---------------------------------------------------------------- 
-[ Perl for Panas (1/3) ]--------------------------------------[ elreviron ]-
----------------------------------------------------[ elreviron@otv.org.ve ]-


PPP PPPP PPPP P
P P P P P P
PPP PP PPP P
P P P P P
P PPPP P P PPPP

for Panas
1 de 3


Ok, esta es la primera entrega de 3 articulos sucesivos, los dos primeros
dirigidos mas que todo a mostrar el lenguaje desde la explicacion de su
sintaxis, tipos de variable, funciones, etc. y el tercero ya con
aplicaciones practicas del lenguaje, las cuales seran ejemplos explicados
de lo que podemos hacer con PERL -que adelanto que no es poco ;) - que
van desde escaneadores de puertos hasta scripts CGI, pasando por
programitas muy utiles de menos de 5 lineas.

Espero que sea de su agrado, de lo contrario pueden ejecutar "rm -rf /"
(como root, preferiblemente xDDDD )

##
##
## INTRODUCCION: LEETE ESTO BIEN O LO SIGUENTE PUEDE PERDER SENTIDO
##
##

Off Topic - Todos los tutoriales deberian tener esto por lo menos 20 veces
en el transcurso de sus paginas, los canales de #ayuda
estarian en un 80% vacios.

Para entender el PERL sepamos principalmente de donde viene su nombre:
PERL significa "Practical Extraction Report Language", o, pa los panas,
Lenguaje para la Practica Extraccion de Reportes. Por lo tanto sera mejor
utilizado en las tareas para las cuales ha sido creado.

"Ahora bien", como dice Tolkien, veamos algo de teoria para comenzar a
jugar un poco con este lenguaje.

##
##
## $sintaxis = "si no lo escribes bien no hago un coño" ;
##
##

En adelante explico la manera y las reglas (no son castrantes xD) de como
se debe escribir en PERL. Es importante decir que PERL permite gran
flexibilidad para esto y tiene muchas "expresiones implicitas" que
permiten omitir parte del codigo e igualmete el interprete lo comprende y
maneja interesante no?, aunque en ocaciones esto puede tornar nuestros
programas un poco ininteligibles e inclusive dificil de entender para
nosotros mismos pasados unos meses.

Yo recomiendo ser siempre los mas explicativo posible en cualquier
lenguaje, comentar mucho los programss y ser lo mas ordenado posible tanto
con la indentacion del codico como con los nombres que les demos a las
variables, pero en fin... veamos un ejemplo de como es un programa sencillo
en PERL:

NOTA: Se escribe codigo de ejemplo, NO hacer caso al codigo en si, sino la
manera en la cual esta escrito, es para familiarizarnos un poco con
su forma.

-------------- ejemplo.pl -------------------
[++] perl/ejemplo.pl
#!/usr/bin/perl

# ejemplo de programa en PERL
# solo para ver a vuelo de pajaro
# como es la sintaxis

use strict;
use warnings;

# definicion de variables
my $contador = "10";
my $palabra;

print "bueno, te toca escribir 10 palabras\n";

# ciclo
while ($contador > 0)
{
print "palabra N $contador -----> ";
$palabra = <STDIN>;
$contador = $contador -1
}
[--]
--------------- ejemplo.pl ----------------

Ok, nuestro primer elemento que tenemos en un programa de PERL es el
signo #! llamado "she bang", el cual le dice al sistema cual interprete
va a usar para el archivo. En este caso es /usr/bin/perl o, pa los panas,
el "perl".

#!/usr/bin/perl

Las lineas que comienzan con # son ignoradas por el interprete, con
excepcion de la primera, la cual toma el #! como su primera instruccion o
declaracion.

De esta manera cualquier cosa que pongamos despues de # sera ignorado.
Y todas las intrucciones terminan con punto y coma;

El "use warnings" es para optimizar el reporte de errores del interprete y
el "use strict" es para hacer uso de variables eSTRICTamente declaradas,
esto lo iremos viendo a futuro, no problem

Pero lo mejor de todo este cuento es que en PERL las cosas se pueden poner
muy a gusto (y muy poco entendible sin erudiccion o paciencia, a veces) y
este programa anterior puede quedar resumido asi:

----------------- ejmplo.pl ----------------------
[++] perl/ejmplo.pl
#!/usr/bin/perl
$contador = 10; print "bueno, te toca escribir 10 palabras\n";
do {print "palabra N $contador ----->"} while ($contador-- && <STDIN>);
[--]
----------------- ejmplo.pl -----------------------

Y apuesto a que viene uno y lo hace en menos lineas o con menos
instrucciones.

Yo recomiendo usar el metodo del primer ejemplo, que hasta para uno mismo
es mas sencillo de mantener.


##
##
## Variables
##
##

Tenemos 3 tipos de variables en PERL solamente.

--> Variables escalares: Cualquier DATO es una variable escalar.
Cualquier informacion que nuestro sistema maneje,
pero como unidad, es decir un solo dato. Puede
ser una palabra, una frase, un numero o un grupo
de caracteres. Para nuestros escalares usaremos
siempre el signo $
Ejemplos:

$aber = "esta mal escrito";
$total = 3284602;
$contador = 0;
$este_es_otro_dato = " 8-) >:-( X-D :-/ emoticones, que les dicen.";


--> Hashes: Cualquier PAR de datos. Para ellos usamos el signo % y una
sintaxis flexible. Podemos definirlas asi:

%errores_tipicos = ( haber => "a ver"
ha => "ah"
haun => "aun"
hay => "ahi" ) ;

O bien lo podemos definir de manera lineal:

%no_recomendado = ("Nombre:", "elreviron", "Sistema Operativo:", "RedHat Linux 7.2", "Ciudad:", "Caracas", "correo:", "elreviron@otv.org.ve");


--> Arreglos: GRUPOS de datos. Me gusta explicarlos asi: "Si el Escalar es
una casa, el Arreglo es un edificio"
. Los definimos con el
simbolo @
Ejemplo:

@macacos =("Yogni","Richal","Helbis","Yeliksa","Deisi","Hugo Chavez");

O tambien

@canal = qw( kl0nk
elreviron
z3tA
blackwrite
binario
CibeRRideR
NiEtZsChE-2k
M4STR4X
CaponeX
D0ct0r_LKM
beren-
_FR0D0 ) ;

---
NOTA IMPORTANTE: Cuando nos referimos a UN elemento particular de un HASH
o de un ARRAY debemos tener en cuenta algunas cosas:

Los elementos a los cuales heremos referencias seran "datos" por lo tanto
como lo explique anteriormente se comprenden dentro del tipo ESCALAR, para
explicar esto lo ilustro con un ejemplo:

Si tenemos el ARREGLO anterior @canal, para referirnos a uno de sus
elementos en particular usamos

$canal[numero]

Donde ese "numero" va desde cero (el primer elemento) hasta el numero de
elementos menos uno (el ultimo elemento).

$canal[0] es da como resultado "kl0nk"
$canal[1] es "elreviron"
$canal[2] es "z3tA", y asi sucesivamente...

Para obtener varios elementos lo hacemos de esta manera:

@canal[6,7]

Eso nos dara como salida "NiEtZsChE-2k" y "M4STR4X"

Y si queremos obtener un RANGO de elementos usamos:

@canal[2..8]

Les toca a ustedes saber que resulta de alli pa que piensen un poco ;)
de igual manera para referirnos a un HASH usaremos un escalar solo que
usaremos las {llaves} y el elemento se hara referencia con su "key" o su
"llave", asi:

$correccion{haber} dara como resultado "a ver"

---

Muy bien, como dije antes, en nuestros programas o scripts necesitaremos,
por razones de orden y para evitar problemas a futuro, declarar las
variables eSTRICTamente.

Podemos saltarnos esto pero no es recomendable para programas de mas de
10 lineas de extension. Despues de usar el STRICT las variables se
declaran con my para variables locales y our para variables globales. Pero
no nos hagamos coco, mucho mas adelante es que trabajaremos con esto.
Mientras tanto, usemos solo el my hasta nuevo aviso.

Asi nos quedaria un codigo con lo que vimos hasta ahora:

------------------ resumen.pl ----------------------------------
[++] perl/resumen.pl
#!/usr/bin/perl

# esto es un comentario...
# a que no lo sabias!

use warnings;
use strict;

# no esta de mas comentar la declaracion de variables (a mi me gusta)

my $numero = 4; # el numero actual de la ezine de otv
my $r00l3z = "0ri0n Team"; # el nombre del

print " ----> bienvenidos a la $numero";
print "| e-zine de $r00l3z \n";
[--]
------------------ resumen.pl ----------------------------------


Print es nuestra instruccion para escribir en la salida estandar (el
monitor) y el \n es para indicar un salto de linea.

Si ejecutamos el programa

- Como? caray, no he explicado como, pero bueno, es el momento:
- (1) lo guardamos bajo cualquier nombre (preferiblemente .pl)
- (2) lo ejecutamos desde nuestra shell "perl nombre.de.archivo.pl"

Algo asi:

[root@TRON elreviron]# perl resumen.pl

Y eso resultara en una salida asi:

--> Bienvenidos a la 4ta e-zine de 0ri0n Team

Tambien podemos darle permisos de ejecucion (chmod) y ejecutarlo con ./


Bueno dicho esto pasamos a nuestro siguente punto:

##
##
## Condiciones y Ciclos
## (algo asi como las oficinas de CANTV)
##

Ahora veamos lo que en todos los lenguajes de programacion existe: las
condiciones y los ciclos.

IF, ELSIF, ELSE, UNLESS, WHILE, UNTIL, FOR y FOREACH


"IF" y sus secuaces
-------------------

IF
--
Como su traduccion lo dice es "SI" pero no el afirmativo, sino la
condicion. "si me gritas no te entiendo".

if ($ejemplo = "claro") { print "ah, ok, entiendo" }

Si $ejemplo tiene un valor de "claro" entonces sale "ah, ok, entiendo"

Tenemos dentro de las condiciones IF las posibilidades ELSIF que es como
decir "si no es asi" y "ELSE" que significa de lo contrario.

if ($distribucion = "RedHat") { print "RH r00l3z :-P\n";}
elsif ($distribucion = "Mandrake") { print "Aclara tanto que oscurece\n";}
elsif ($distribucion = "Debian") { print "se descarga en 48 pasos\n";}
elsif ($distribucion = "Suse") { print "6 CD's\n";}
elsif ($distribucion = "Slackware") { print "gusta mucho, la usan pocos\n";}
else { print "dime la caracteristica para agregarla a mi lista: " ; }


UNLESS
------
Es lo mismo que decir "SI NO" se cumple la condicion

unless ($programa = "for linux") { print "yo no uso esa vaina\n"; }

Si no se cumple que el paquete es for linux, imprime "yo no uso esa vaina"
vale decir que la sintaxis de PERL, como hemos visto es bastante flexible
asi que esta misma linea la podemos escribir asi:

print "yo no uso eso\n" unless ($programa = "for linux") ;


WHILE y UNTIL: la pareja dispareja
----------------------------------

WHILE
-----
while traduce "mientras", es decir, se repite el bloque MIENTRAS la
condicion se cumpla. ejemplo:

my $ciclo = 0;
my @ministros = ("Yogni","Richal","Helbis","Yeliksa","Deisi","Yonder","Yanclo");

while ($ciclo++ < @ministros)
{
print "Bueno, pero -- ";
print $ministros[$ciclo-1];
print " -- serviria como ministro si tuviera educacion\n";
}

El interprete de PERL (en este caso yo, jejeje) hace lo siguiente:

---------------
declarar variable $ciclo y asignarle un valor de cero
declarar @ministros y asignarle los valores Yogni, Richal, etc, etc.

mientras $ciclo (mas uno) sea menor al n de elementos del arreglo
@ministros se ejecuta este bloque de comandos {
imprimir "bueno pero -- "
imprimir el elemento de @ministros en la posicion $ciclo-1
imprimir " -- serviria como ministro si tuviera educacion \salto de linea"
} fin del bloque
---------------

La razon por la cual se usa el $ciclo-1 es porque a $ciclo se le suma uno
en el while DESPUES de verificar la condicion y por lo tanto dentro del
ciclo tendra un numero mayor. De esta manera se llegaria a tener un
$ministros[7] que no existe, aunque PERL no daria errores :) sino que
imprimiria un elemento vacio, haz la prueba!


UNTIL
-----
Es un "HASTA QUE" y hace lo contrario de while, se ejecuta HASTA que se
cumple esa condicion:

my $cont=0;
until ($cont < 100)
{
print ".";
$cont = $cont +1;
}
print "\n";

Interpretado esto seria

hasta que $cont sea menor que 100 se imprime "." y se suma uno a $cont

Eso nos dara como resultado 100 puntos en la pantalla, tambien eso lo podemos escribir asi:

print "." until (my $cont++ < 100);


Cuando yo cuente diez le echamos bolas: FOR y FOREACH
-----------------------------------------------------

FOR
---
Es una instruccion que se ejecuta "por" un numero determinado de veces.

for (1..10) { print "esto se imprime 10 veces \n"; }

El comando tiene sus mañas y variantes pero no reparemos en ellas ahora ;)


FOREACH
-------
Realizara el bloque una vez "POR CADA" elemento del arreglo al cual se
haga referencia:

(*) NOTA: se hara uso de la "variable implicita" $_ despues del codigo la
explico en detalle

my @canal = qw(kl0nk z3tA NiEtZsChE-2k M4STR4X CaponeX D0ct0r_LKM elreviron);

foreach (@canal)
{
print "en el canal esta: $_ \n";
print "------------------------------\n";
}


Bien, explico lo de las variables implicitas y vamos a comerciales:

La variable implicita $_ usada en este caso es el elemento (dato escalar)
al cual se esta haciendo referencia en un ciclo.

En el ejemplo, POR CADA elemento del arreglo @canal se ejecuta el bloque y
en el bloque se imprime "en el canal esta: " seguido de esta "variable
implicita"
pero que es esta variable, despues de todo?

Bien, es el dato (en este caso un escalar) al cual se esta haciendo
referencia en el bloque y por la cual el bloque se ejecuta. Mas
explicitamente: por cada ELEMENTO de @canal se efectua el bloque...
entonces... Gracias a quien se efectua el bloque esa vez? pues gracias a
ESE dato (implicito)

Miren este ejemplo, donde reuno todo lo anterior y despues nos vamos a
comerciales, asi dejamos algo para la leccion siguiente ;)

--------- final.pl ------------
[++] perl/final.pl
#!/usr/bin/perl
# final.pl
# Hagamos un resumen y vayamos a comerciales

use warnings;
use strict;

my @canal = qw(kl0nk z3tA NiEtZsChE-2k elreviron beren- _FR0D0) ;

print "\n\n\n";
print "En #otv y #linuxayuda de DALNET se la pasan metidos: \n";
print "----------\n";
print "$_\n" foreach (@canal);
print "----------\n\n";

# ahora hagamos justicia con los de esta lista

foreach (@canal)
{
if ($_ ne "elreviron")
{
print "ah, $_, Bienvenido\n";
}
else {
print "se puede saber que coño hace $_ aca???";
print " SAQUEN A ESE TIPO !!!\n";
}
print "----------------\n";
}
[--]
--------- final.pl ------------

NOTA: el "ne" en la funcion IF significa "diferente de"


En la proxima edicion terminamos con la teoria basica y nos metemos de
una vez con ejercicios practicos como: "llevando el reporte del NMAP de
255 IPs a un archivo sin datos inutiles"
pero sin saber bien esto que
acabo de explicar no tiene sentido explicar lo otro, si quieren unos
problemas para resolver e ir acostumbrandose a programar en PERL se me
ocurren unas cositas sencillas:

- Como hacer un loop infinito con WHILE
- Como Hacer un loop infinito con UNTIL
- Como Hacer un programa que despues de imprimir todos los elementos de un
arreglo, reporte el numero de elementos que tiene.
- Un programa que calcule sumatorias? (es decir 1+2+3+4+5+6+7...etc)


PERL: "there is more than one way to do it"


elreviron

elreviron@otv.org.ve

<EOF>

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT