Capítulo 5
Expresiones regulares en Perl

Un patrón es una secuencia de caracteres que se buscan dentro de una cadena de caracteres. En Perl, un patrón se representa entre diagonales.
/Aprendiendo/
El patrón de referencia encontrará todas las ocurrencias que existan en una cadena de caracteres.

El operador de coincidencia

Perl define un operador especial que prueba si un patrón coin-cide dentro de una cadena de caracteres o no. Dicho operador se define por los caracteres:
=~ Veamos un ejemplo:

Ejercicio 1
1) Capturar el código que se muestra a continuación

#!/usr/local/bin/perl
#programa: expre1.pl
print (“ Es divertido aprender Perl, si o no?\n”);
$question=<STDIN>;
if ($question=~/si/)
{ print (“Porque facilita mi trabajo de programacion\n”); }
else {
 print (“Aparentemente no. Pero, es muy fácil de aprender\n”); }

2) Grábalo con el nombre: expre1.pl
3) Cámbiale los derechos y ejecútalo

¿Cómo funciona el programa?
El programa es muy parecido a los que se han creado en los anteriores capítulos, pero contiene una instrucción con la cual nos permite comparar un patrón de caracteres dentro de una cadena de caracteres. Dicha instrucción es:

if ($question=~/si/) { print (“Porque facilita mi trabajo de programacion\n”); }

Donde el programa compara si la cadena de caracteres almacenada en la variable $question que contiene un si. Si es afirmativo, ejecuta lo que se encuentra dentro de los corchetes “{}”. De lo contrario, ejecuta el else.
Como se puede observar, el operador “=~”, permite comparar caracteres, cadenas de caracteres que se encuentran dentro de una variable.

Ejercicio 2
Instrucciones: crear un programa que cuente las veces que aparece la palabra Internet del archivo muestra.txt

Ejercicio 3
Introducción: considera que es el responsable de una página Web en Internet. El protocolo http que administra dicha página se encuentra instalado en una máquina Unix. El protocolo genera dentro del subdirectorio logs, varios archivos, tales como el registro de los accesos a la página, los errores que genera, etcétera. El propio protocolo genera un archivo de texto con esta información. Sin embargo, la forma como lo almacena es un poco legible para la persona que lo lea. Para solucionar este problema, se emplea un programa creado en Perl, empleando expresiones regulares para que nos muestre cuantas veces se ingreso a documentos HTML, en que día de la semana, y mes del año. Para ello, tenemos listo un archivo llamado prueba.log que tiene parte del contenido del archivo llamado “access.log”. Entonces,

1) Revisar el contenido del archivo prueba.log
2) Observar el formato que contiene el archivo
3) Crear el programa en Perl que satisfaga los requerimientos antes mencionados
4) grabarlo con el nombre expre3.pl
5) Cambiarle los derechos y ejecutarlo

Caracteres especiales en los patrones

Perl puede manejar varios caracteres especiales dentro de los patrones, los cuales posibilitan el número de coincidencias en una cadena de caracteres. Estos caracteres especiales son lo que hace a los patrones útiles.

El caracter especial +

El caracter especial + significa uno o más de los caracteres precedentes. Por ejemplo, el patrón /de+f/ busca las coincidencias con cualquiera de los siguientes cadenas:

def deef deeef deeeeef

El caracter especial[ ]

El caracter especial [ ] te permite definir patrones que coinciden con un grupo de alternativas. Por ejemplo el siguiente patrón encuentra las coincidencias: def o dEf. /d[eE]f/

Ejercicio 4
Instrucciones:
Teclear el código que se muestra a continuación: Programa 5.4
#!/usr/local/bin/perl
#programa:expre4.pl
$contador=0;
$linea=<STDIN>;
while ($linea ne “”)
{ chop ($linea);
@palabra=split(/[\t ]+/, $linea);
$contador+=@palabra;
print $contador;
$linea=<STDIN>; }
print (“Numero total de palabras: $contador\n”);
 

Los caracteres especiales * y ?

Con el caracter especial * se tiene coincidencias de cero o más ocurrencias del caracter al que precede. /de*f/ tenemos: df, deef.

Con el caracter especial ? se tiene coincidencias de cero o un caracter del caracter que le precede.
/de?f/

Secuencias de escape para los caracteres especiales
Si quieres que el patrón incluya un caracter que normalmente es tratado como caracter especial, coloca el caracter con una diagonal invertida \.

Ejercicio 5
Instrucciones:
Capturar el programa que se muestra a continuación: ograma 5.7
#!/usr/local/bin/perl
#programa: expre5.pl
$wordcount=0;
(open (ARCHIVO, “prueba.log”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
if ($line=~/\/export\//)
{ $wordcount=$wordcount+1; }
$line=<ARCHIVO>;
}
print (“directiva encontrada: $wordcount\n”);

La coincidencia de cualquier letra o número se puede incluir dentro de un rango, veamos:

/a[0-9]c/

Lo mismo ocurre para las letras

/[a-z][A-Z]/

Sujeción de patrones en Perl

^ o \A coincidencia al inicio de una cadena solamente $o \Z coincidencia al final de la cadena solamente \b Coincidencia solo al inicio de una palabra \B Coincidencia dentro de una palabra.
Veamos: /^def$/ significa que solo la coincidencia def y no otra.

Ejercicio 6
Instrucciones:
Capturar el programa que se muestra a continuación

#!/usr/local/bin/perl
#programa: expre6.pl
$wordcount=0;
(open (ARCHIVO, “prueba.log”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
if ($line=~/^\[Wed/)
{ $wordcount=$wordcount+1; }
$line=<ARCHIVO>;
}
print (“Palabras con Wed que aparecen: $wordcount\n”);

Ejercicio 7
Instrucciones:
Teclear el programa que se muestra a continuación:

#!/usr/local/bin/perl
#programa: expre7.pl
$wordcount=0;
(open (ARCHIVO, “prueba.log”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
if ($line=~/\bWed/)
{ $wordcount=$wordcount+1;}
$line=<ARCHIVO>;
}
print (“La palabra Wed encontrada: $wordcount\n”);

Substitución de variables en los patrones

Si lo deseas, se puede usar el valor de una variable escalar en un patrón. Veamos un ejemplo:

Ejercicio 8
Instrucciones:

#!/usr/local/bin/perl
#programa: expre8.pl
$wordcount=0;
(open (ARCHIVO, “prueba.log”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
$patron=”Wed”;
if ($line=~/$patron/)
{ $wordcount=$wordcount+1; }
$line=<ARCHIVO>;
}
print (“Palabras con Wed encontradas:: $wordcount\n”)

El operador de substitución

Perl permite substituir una parte de una cadena usando el operador de
substitución. El cual tiene la siguiente sintaxis:

s/pattern/replacement/

veamos un ejemplo

Ejercicio 9
Instrucciones:
Teclear el código que se muestra a continuación:

#!/usr/local/bin/perl
#programa: expre9.pl
$wordcount=0;
(open (ARCHIVO, “trabajo.txt”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
$line=~s/Internet/internet/;
print “$line\n”;
$wordcount=$wordcount+1;
$line=<ARCHIVO>;
}

Ejercicio 10
Instrucciones:
¿Qué cambio debería hacerse en el programa anterior, para que almacenara los cambios utilizados en operador de substitución?

Solución de problemas del capítulo 5

Ejercicio 2

#!/usr/local/bin/perl
#programa: expre2.pl
$wordcount=0;
(open (ARCHIVO, “muestra.txt”));
$line=<ARCHIVO>;
while ($line ne “”)
{ chop ($line);
if ($line=~/Internet/)
{ $wordcount=$wordcount+1; }
$line=<ARCHIVO>;
}
print (“Cuantas veces aparecio la palabra Internet: $wordcount\n”);

Ejercicio 4

#!/usr/local/bin/perl
#programa: expre4.pl
$wordcount=0;
(open (ARCHIVO, “prueba.log”));
$line=<ARCHIVO>;
while($line ne “”)
{ chop ($line);
if ($line=~/html/)
{ $wordcount=$wordcount+1; }
$line=<ARCHIVO>;

print (“Cuantos documentos HTML fueron?: $wordcount\n”);