• Publicidad

Perl y XML

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Perl y XML

Notapor ana gonzález ledesma » 2007-11-02 11:53 @537

Hola, escribo para pedir una guía en la documentación que debo buscar para aprender a hacer un programa que me reconozca una lista de palabras en un texto y que una vez reconocidas les introduzca la etiqueta en XML.

Así por ejemplo tengo un archivo de texto y tengo otro archivo lleno de etiquetas del tipo:
Código: Seleccionar todo
<N genero=masculino>caso</N>
<N genero=femenino>casa</N>


Lo que me gustaría es que cada vez que en el texto se encontrara la palabra "casa" que la sustituyera por <N genero=femenino>casa</N>, y así sucesivamente con todo el archivo de etiquetas.

El problema que tengo es que del archivo de etiquetas me interesa por una parte "caso" y "casa" porque los necesito para buscar estas palabras en mis textos pero luego a su vez también necesito toda la etiqueta para sustituirla por la palabra "caso" cuando la encuentre en el texto.

En fin, seguro que es un problema muy común y ¿me podéis recomendar un manual donde se hable de estos problemas?
ana gonzález ledesma
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-11-02 10:25 @475

Publicidad

Notapor explorer » 2007-11-02 12:17 @553

Las etiquetas no siguen la regla de ficheros XML bien formados: los atributos deben tener sus valores entrecomillados. ¿Seguro que el archivo de etiquetas es un XML?

El cuanto al problema, se divide en varios más pequeños: leer un fichero XML, leer el fichero de texto, hacer los cambios, y grabar el resultado.

Este es uno de esos problemas de 'filtrado' de ficheros, cuya estructura es casi siempre la misma: un bucle por todo el fichero, línea a línea, modificándola con las expresiones regulares o transformaciones que queremos hacer, y grabando el resultado antes de pasar a la siguiente línea.

En este caso, yo lo haría al revés: leería todo el texto en una sola variable escalar y luego el bucle lo haría sobre las etiquetas, haciendo una sustitución (s///) en el texto, de cada palabra encontrada, por la etiqueta correspondiente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Perl y XML

Notapor Jenda » 2007-11-03 06:44 @322

Me parece mejor procesar el fichero línea a línea. De primero, leer el XML y producir un hash y después leer el fichero, línea a línea, buscar palabras y por cada palabra ver si está en el hash y si está sustituir por este trozo de XML. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;
no warnings 'uninitialized';
use XML::Rules;

my $xml_fichero = '...';
my $text_fichero = '...';
my $fichero_nuevo = '...';

my %hash;
my $parser = XML::Rules->new(
  rules => [
        _default => '',
        N => sub {
                $hash{$_[1]->{_content}} =$_[1]->{genero};
                return;
        }
  ]
);

$parser->parse($xml_fichero);

open IN, '<', $text_fichero or die qq{No puedo leer de "$text_fichero": $^E\n};
open OUT, '>', $fichero_nuevo or die qq{No puedo crear "$fichero_nuevo": $^E\n};
while (<IN>) {
        s<\b(\w+)\b><if (exists($hash{lc $1})) { "<N genero=\"$hash{lc $1}\">$1</N>" } else { $1 }>ge;
        print OUT $_;
}
close IN;
close OUT;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Con el XML::Rules extraes los géneros de las palabras y produces el hash así:

Código: Seleccionar todo
%hash = (
  caso => 'masculino',
  casa => 'femenino',
  ...
);


después en cada línea sustituyes cada palabra (\b significa el lugar entre una palabra y espacios o puntuación, \w es una letra y + significa "lo previsto una o más veces) por el XML o por sí mismo.
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 1 invitado