Palabras Repetidas
Su jefe le pide una herramienta que compruebe la aparición de
duplicaciones consecutivas en un texto texto (como esta esta y la anterior anterior).
La solución debe cumplir las siguientes especificaciones:
- Aceptar cualquier número de ficheros. Resaltar las apariciones
de duplicaciones. Cada línea del informe debe estar precedida del nombre del fichero.
- Funcionar no sólo cuando la duplicación ocurre en la misma línea.
- Funcionar independientemente del case y de los blancos usados en medio
de ambas palabras.
- Las palabras en cuestión pueden estar separadas por tags
HTML
.
Esta es la solución:
1 #!/usr/bin/perl -w
2 # one <a>one</a>
3 # is two three
4 # three
5 $/ = ".\n";
6 while (<>) {
7 next if !s{
8 \b # start word ...
9 ([a-z]+) # grab word in $1 and \1
10 ( # save the tags and spaces in $2
11 (\s|<[^>]+>)+ # spaces or HTML tags
12 )
13 (\1\b) # repeated word in $4
14 }
15 "\e[7m$1\e[m$2\e[7m$4\e[m"igx;
16 s/^([^\e]*\n)+//mg; # remove lines that don't contain escapes
17 s/^/$ARGV: /mg; # insert filename at the beginning of the lines
18 print;
19 }
Normalmente el carácter ^
casa solamente con el comienzo de la cadena y el carácter $
con el final. Los \n
empotrados no casan
con ^
ni $
. El modificador /m
modifica esta conducta. De este modo ^
y $
casan con cualquier frontera de línea interna. Las anclas \A
y \Z
se utilizan entonces para casar con
el comienzo y final de la cadena.
Sigue un ejemplo de uso:
> cat double.in
one <a><b>one</b></a>
is two three
three
.
xxxx
>
> doublee.pl double.in
double.in: one <a><b>one</b></a>
double.in: is two three
double.in: three
Casiano Rodríguez León
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León
is licensed under a Creative Commons Reconocimiento 3.0 Unported License.
Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19