El siguiente código se corresponde con el contador de etiquetas creado en perl:
#!/usr/bin/perl # # contador_tags.pl - Script que obtiene un reporte sobre las etiquetas # más utilizadas en los documentos, escritos en # DocBook XML, analizados. # # # NOTA: para la correcta ejecución de este script, es necesario # tener instalado el analizador gramatical de XML "rxp". # Indicad en la definición de variables, la localización # de este programa en vuestro sistema. # # http://www.cogsci.ed.ac.uk/~richard/rxp.html # # # Copyright (C) 2002 # # Fernando Reyero Noya <[email protected]> # Sergio González González <[email protected]> # # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # ------------------------------- # Definición de algunas variables # # Directorio por defecto donde se encuentran los archivos a analizar my $directorio_ejemplos = "../documentos/docbook_xml_reducida/"; # Extensión de los archivos a analizar my $extension = "xml"; # Array que almacena los posibles archivos a analizar my @posibles_archivos_analizar; # Array que almacena los archivos verificados que serán finalmente # analizados my @archivos_analizar_verificados; # Array que almacena todas las etiquetas obtenidas de los documentos analizados my @todas_las_etiquetas; # Array asociativo que almacena el par "nombre_de_la_etiqueta, número_de_apariciones" my %apariciones_etiquetas; # Localización de 'rxp' my $rxp = "/usr/bin/rxp"; # Localización de 'find' my $find = "/usr/bin/find"; # Localización del analizador de etiquetas my $analizador_etiquetas = "./analizador_tags"; # ------------------- # Comienzo del script # # # Verificamos que los programas necesarios para ejecutar este script # están presentes en el sistema. # unless (-e $rxp) { # rxp no se encuentra en la ruta especificada, salimos del programa print "\n * $! '$rxp' (programa abortado)\n\n"; exit -1; } unless (-e $analizador_etiquetas) { # El analizador de etiquetas no se encuentra en la ruta especificada, # salimos del programa print "\n * $! '$analizador_etiquetas' (programa abortado)\n\n"; exit -1; } # # Analizamos los parámetros pasados al script: # # - Si no se pasa ningún parámetro, se obtienen los archivos de la # ruta por defecto. # # - Este script acepta un parámetro: la ruta donde están almacenados # los documentos a analizar. # $directorio_ejemplos = $ARGV[0] if( length($ARGV[0]) != 0 ); # comprobamos si existe el directorio de archivos a analizar unless (-d $directorio_ejemplos) { print "\n * $!: '$directorio_ejemplos' *\n\n"; exit -1; } # # Obtenemos los archivos que debemos analizar # print "\nBuscando los documentos... "; @posibles_archivos_analizar = `$find $directorio_ejemplos -name "*.$extension" 2>errores.log`; # # Comprobamos la salida de find. Si ha tenido algún error, lo notificamos y # salimos del script # if (($? >> 8) > 0) { print "\n\n ERROR al ejecutar `find \$directorio_ejemplos -name \"*.\$estension\"` (compruebe el archivo errores.log)\n\n"; exit -1; } else { if (-e "errores.log") { `rm -rf errores.log`; } } print "[Hecho]\n\n"; # Búsqueda de documentos # # Analizamos el documento generado a partir de las porciones (si está presente # el programa rxp en el sistema), para ver si contiene errores. # print "Analizando la validez de los documentos... "; my $error = 0; # Variable que indica si hemos tenido algún error # en el análisis de los documentos foreach $documento ( @posibles_archivos_analizar ) { chomp $documento; `echo "\n########## $documento ##########\n" >> rxp.log`; `$rxp -VVNx $documento >/dev/null 2>>rxp.log`; if ( (($? >> 8) == 0) ) { # Eliminamos el archivo rxp.log if ( (-e "rxp.log") && !$error ) { `rm -rf rxp.log`; } push(@archivos_analizar_verificados, $documento); } else { # Alguna porción está mal formada o posee errores print"\n ** Aviso ** los siguientes archivos contienen errores y no se tendrán en cuenta: \n\n" if ( !$error ); print " - error en el documento: '$documento'\n"; $error = 1; } # else } # foreach print "\nRevisa el archivo rxp.log para ver los errores...\n\n" if ( $error ); print "[Hecho]\n\n"; # # Analizamos los documentos válidos en busca de sus etiquetas y las almacenamos # en el array: "todas_las_etiquetas" # print "Buscando etiquetas... "; foreach $archivo (@archivos_analizar_verificados) { @todas_las_etiquetas = (@todas_las_etiquetas, `$analizador_etiquetas $archivo`); } print "[Hecho]\n\n"; # # Contamos el número de etiquetas # print "Contando las etiquetas... "; foreach $etiqueta ( @todas_las_etiquetas ) { chomp $etiqueta; if ( exists $apariciones_etiquetas{ $etiqueta } ) { # Sumamos una unidad a la etiqueta %apariciones_etiquetas = (%apariciones_etiquetas, $etiqueta, $apariciones_etiquetas{"$etiqueta"}+1); } else { %apariciones_etiquetas = (%apariciones_etiquetas, $etiqueta, 1); } } # foreach print "[Hecho]\n\n"; # # Mostramos los resultados obtenidos # print "A continuación se mostrarán las etiquetas y el número de apariciones:\n\n"; print "Número\t\t\tEtiquetas\napariciones\n\n"; while( ($etiqueta, $numero_apariciones) = each(%apariciones_etiquetas) ) { print "$numero_apariciones\t\t\t$etiqueta\n"; } |