Uno de los más populares lenguajes de programación puede ser Perl, está dentro del core de la mayoría de los Unix (recientemente FreeBSD ha cambiado eso).
Perl tiene muchas ventajas que lo hacen una elección perfecta (está instalado -por defecto- en todos los Unix y es simple y potente).
En esta lección se verán:
Una de las cosas que lo hace potente son las expresiones regulares (regular expresions). Lo más básico es entender el concepto de las expresiones regulares sin ver código. Por ejemplo:
El sexto piso.
Encontrar en el texto indicado la palabra sexto es simple. Si se lo dice oralmente, hay algo más que entra en función, las mayúsculas y minúsculas no son tomadas en cuenta (aunque en realidad en la oralidad no existen).
Un ejemplo más complejo es:
No hay lugar como el 127.0.0.1.
Aquí hay algo que sirve mucho como expresión regular, una dirección IP.
Es decir, ¿cómo un humano reconoce una dirección IP? La pregunta es bastante simple y hasta muchos pensarían que no merece ser preguntada, pero justamente ese es el problema fundamental de los grandes problemas. Este problema es extremadamente simple, pero la solución es, uno busca la ocurrencia de unos 4 grupos de dígitos (entre 1 y 3 entorno cerrado) separados entre sí por puntos. Estos números son menores de 255 y son enteros positivos (sin signo en realidad) y el primer y último número no pueden ser cero. Y esa ocurrencia, la asigna a la variable $ip.
Lo que quedaría es (en humano) que la variable $ip es igual a 127.0.0.1. Esto la mayoría de nosotros lo hace todo el tiempo al reconocer en textos técnicos direcciones de todo tipo (10.0.0.100, 10.73.6.17, 200.63.24.3, etc).
En código más simple sería (archivo llamado programa.pl):
$a="No hay lugar como el 127.0.0.1";
$ip = "0";
if($a =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/){
$ip = $1;
}
print "ip es $ip\n";
La salida usando el perl -w programa.pl sería:
ip es 127.0.0.1
En este ejemplo, se obtendrá cualquier número, por ejemplo: 255.255.255.255, 1.2.3.4 o 234.456.789.0. Obviamente que esto no es lo que esperabamos en un principio, pero en un principio nos sirve para analizar el código.
El =~ indica que lo que sigue es una expresión regular.
El m// (dejando de lado todo lo que está entre las barras "/"), le indica que la expresión regular regresará 1 si tiene al menos una coincidencia de todo lo que indica dentro. El m que está delante es de match (coincidencia), y como es el más usado puede obviarse (de hecho mucha gente lo suele obviar).
Luego queda lo más interesante, el regex, la expresión regular en sí misma (a.k.a. el choclo ese).
Viendolo como una expresión matemática, comenzaré con lo más general, los parentesis. Esto es usando para decir "este grupo". Y aparte de eso, cada parentesis utilizado deja una variable en el bloque que es el $1, $2 hasta $n (donde $n es el número del último grupo de parentesis). Más adelante hay otro mejor ejemplo de esto.
Luego está el \d, que significa "un dígito". Esto es 1, 2, 3, 4, 5, 6, 7, 8, 9 y 0.
Luego hay dos números separados por comas y entre llaves. Esto lo que significa es que el número debe repetirse desde el primer valor hasta el segundo. O sea, {n,m} el valor debe repetirse como mínimo n veces, y como máximo m veces. Si se epsecifica solo un número, el valor anterior debe repetirse ese número de veces.
El sigiente valor, el \. es un punto tal cual. Esto es debido a que si se pone un punto a secas, significa un caracter (cualquiera que sea).
Luego se repiten varias cosas, el \d, los números entre llaves y el punto con la barra invertida por delante (\.).
Luego termina todo y queda lo más interesante, esto es justamente lo que se hace mentalmente, quedarse con el valor que uno estaba buscando, el $1, y lo asigno a la variable $ip.
Existen muchos otros patrones (cómodines) que ya están, por ejemplo:
Existen otros, pero en futuras lecciones se explicarán más en detalle.
Obviamente que lo visto es muy util, pero sobre todo más util es el querer validar un poco más la IP y ver que no se escape de los valores permitidos:
$a="No hay lugar como el 127.0.0.1";
$ip = "0";
if(($a =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/)
&& ($1 < 255) && ($2 < 255) && ($3 < 255) && ($4 < 255)){
$ip = $1 . "." . $2 . "." . $3 . "." . $4;
}
print "ip es $ip\n";
La salida sería:
ip es 127.0.0.1
Ahora los parentesis en vez de abarcar toda la expresión, los coloco para cada \d{1,3}, y lo que hace es que cargue cuatro valores correspondientes a los números, o sea, el $1, $2, $3 y $4.
Luego esto es verificado si cada uno de esos es menor de 255. Y si todo resulta ser verdadero, lo asigno separado por puntos a la variable $ip.
Aunque le quedaría un detalle:
$a="No hay lugar como el 127.0.0.1";
$ip = "0";
if(($a =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/)
&& ($1 < 255) && ($2 < 255) && ($3 < 255) && ($4 < 255)
&& ($1 > 0) && ($4 > 0)){
$ip = $1 . "." . $2 . "." . $3 . "." . $4;
}
print "ip es $ip\n";
La salida sería:
ip es 127.0.0.1
Ahora valida algo extra, y es que el primer valor y el último no sean ceros.
En vez de usar solamente algo como 127.0.0.1, se peude poner algo como 0.3.3.0 para verificar si funciona:
$a="No hay lugar como el 0.3.3.0";
$ip = "0";
if(($a =~ m/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/)
&& ($1 < 255) && ($2 < 255) && ($3 < 255) && ($4 < 255)
&& ($1 > 0) && ($4 > 0)){
$ip = $1 . "." . $2 . "." . $3 . "." . $4;
}
print "ip es $ip\n";
La salida sería:
matias@decanoi:~$ perl -w k.pl
ip es 0
Comentarios
Enviar un comentario nuevo