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”);