• Publicidad

Rapidez en Perl

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Notapor Jenda » 2008-08-22 17:37 @775

¡Jesús!
Parece que el primer ejemplo no está completo. Podía ser mejor decir qué transformaciones necesitas hacer con el "XML". Me parece que quieres arreglar tags como "<NumeroDe La Su>". Eso se podía hacer con

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lin =~ s{<(/)?([\w-]+[^\w<>-][^<>]*)(/)?>}{
        my ($pre,$tag,$post) = ($1,$2,$3);
        $tag =~ s/[^\w-]+//g;
        "<$pre$tag$post>"
}ges;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Este código aprovecha la posibilidad de especificar no sólo una cadena de caracteres como el substituto, pero también (con /e) un trozo de código. Y este trozo se ejecuta cada vez que el regexp encuentra un match.

Otra cosa que pareces necesitar es añadir algunos \n. Detrás de cada <tag/> o </tag>:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lin =~ s{(<(?:/[^>]+|[^/>]+/)>)}{$1\n}gs;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si también quieres entre los tags como "<TAG67><TAG68>" o mejor dicho, entre cada "><" excepto a "<TagA></TagA>" puedes usar esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
1 while $lin =~ s{<([^>]+)><(?!\1)}{<$1>\n<}gs;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


o

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lin =~ s{><([^/])}{>\n<$1}gs;
1 while $lin =~ s{(</[^/]+>)</}{$1\n</}gs;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No sé qué será más rápido. Pon tu ojo a Benchmark.pm para poder medir que solución es mejor.

¿Se requiere alguna transformación más? :-)
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Publicidad

Notapor explorer » 2008-08-23 04:41 @237

He editado el XML resultado, pero aún así me parece complicado el problema, y como Jenda, quizás sea mejor saber si existe una serie de reglas sencillas para arreglarlo.

De todas formas, yo también aplicaría las reglas de formateo general de Jenda.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-08-23 05:19 @263

Bueno, esta es lo que he podido encontrar... (aparte de lo ya indicado por Jenda):

* Cambiar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (<FILE>) {
        $lin =  $_;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($lin = <FILE>) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* Cambiar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lin =~ s/\n//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
chomp $lin;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* Cambiar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($lin =~ m/<([^<>]+)>(?{$var=$1;})/g) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (($var) = $lin =~ m/<([^<>]+)>/g) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* En todas las expresiones regulares, en las que NO intervenga, en su interior, la interpolación de una variable, añade la opción '/o'. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$lin =~ s/\/><\//\/>\n<\//o;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* El último foreach se puede rehacer así...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $str =~ /.xml version.+/;
if (my ($val1,$val2,$val3) = $str =~ m/(<[^<>]+>)([^<>]*)(<[^<>]+>)/) {
    $val1 =~ s/[^\/\w-]//go;
    $val2 =~ s/[^\/\w-]//go;

    print FILE_NEW "<$val1>$val3<$val2>\n";
}
else {
    #$str =~ s/<[^<\\\/\w->]>//g;           # ¡¡¡ACÁ ESTA EL ERROR!!! #
    $str =~ s/[^<\/\\\w->]//g;
    print FILE_NEW "$str\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

* Esta
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var =~ s/[^<\w->]+//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
quizás debería ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var =~ s/[^<\w>-]+//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
, aunque no estoy seguro. El '-' sí que tiene un significado si está en el interior, pues puede indicar un rango de caracteres.
* En las expresiones regulares que queremos hacer algo como (<[^<>]+>) Y ya sabemos que las marcas están bien cerradas (no existe un '<' dentro de un '<...>'), podemos simplificarlo a (<.+?>).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2008-08-23 07:20 @347

/o es completamente inútil si no hay ninguna variable dentro de la regexp. No significa y no modula nada.

Y en lo general no podemos cambiar (<[^<>]+>) a (<.+?>) si las marcas están bien cerradas. Pruebe esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$str = '<foo><bar>hola</bar></foo>';

$str =~ /(<[^<>]+>)(\w+)/ and print "uno: $1\ndos: $2\n\n";
$str =~ /(<.+?>)(\w+)/ and print "uno: $1\ndos: $2\n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es verdad que al primero la (<.+?>) va a match (no sé cómo se dice en español) lo mismo que (<[^<>]+>) pero si lo siguiente \w+ no encuentra un carácter de palabra, la máquina de expresiones regulares va a volver unos pasos atrás y la (<.+?>) va a comer no solo un tag, sino dos.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Anterior

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron