B.2. Código fuente del contador de etiquetas

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";
}