• Publicidad

Expresión regular para texto anidado

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

Re: Expresión regular para texto anidado

Notapor pablgonz » 2015-01-12 09:42 @445

explorer escribiste:La parte derecha de la expresión regular se podría escribir así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $cuerpo =~ s/$BP.+?$EP/$grap@{[$IMGno++]}$close/msg;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
pero no sé si es más bonito... usa algo de magia ;)

Eso es "magia oscura", ni siquiera usas /e, ¿podrías explicarme la línea? Y una última que me tiene mareado (es del mismo script). En una parte del código tengo puesto esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. opendir(my $DIR, $imageDir);
  2. while (readdir $DIR) {
  3. if (/(?<fig>$name-fig-)(?<num>\d+)$ext/) {
  4. # split con GS
  5. print "Crando $imageDir/$name-fig-$+{num}.pdf\n";
  6.  
  7. system ("gs -q -sDEVICE=pdfwrite -dFirstPage=$+{num} -dLastPage=$+{num} -o $imageDir/$+{fig}$+{num}.pdf $imageDir/$name-fig.pdf");
  8.  
  9. # PNG format
  10. if ($png) {
  11. system("gs -q -sDEVICE=pngalpha -r$DPI $opt_gs_raw -o $imageDir/$+{fig}$+{num}.png $imageDir/$+{fig}$+{num}.pdf");
  12.         }
  13.  
  14. } #close while  
  15.  
  16. closedir $DIR;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En win32 los archivos los muestra ordenados por número (test-fig1,test-fig2,...), pero, en Linux, no. Sé que es un tema de estética el mostrarlos ordenados, pero me gustaría que saliera del mismo modo en ambos sistemas operativos.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Expresión regular para texto anidado

Notapor explorer » 2015-01-12 15:06 @671

Si no usamos /e entonces lo que ocurre con la parte derecha de la expresión regular es una simple interpolación de cadena de caracteres, así que es lo mismo que escribirlo entre comillas dobles.

Y la interpolación, además de sacar los valores de las variables, pueden hacer otras cosas.

Una de ellas es el arcano "@{[ ]}"

Se comenta en un par de sitios, en toda la documentación Perl. Una de ellas es en la explicación de la función scalar, dentro de perlfunc (perldoc -f scalar). Y otra es en perlfaq4, en la pregunta How can I expand variables in text strings? (¿Cómo pueda expandir variables en cadenas de texto?)

Dice:
«El "/e" también ignorará silenciosamente violaciones de strict, reemplazando nombres de variables indefinidas con la cadena vacía. Ya que estoy usando la bandera "/e" (¡incluso dos veces!), tengo los mismos problemas de seguridad que tengo con "eval" en su formato de cadena. Si hay algo malo en $foo, quizás algo como "@{[ system "rm -rf /" ]}", entonces me encontraría en problemas».


El funcionamiento es el siguiente: como Perl encuentra un '@', sabe que lo que sigue es un array, así que debe interpolarlo.

Lo que sigue son unas llaves, así que Perl sabe que lo que debe haber dentro es una referencia que debe convertir a array, por la presencia de la arroba anterior.

Y lo que hay dentro de las llaves sí que es una referencia: son unos corchetes, así que nos encontramos con un array anónimo. Dentro de él, como en cualquier otro array, debe haber una lista de elementos.

Y la lista de elementos, es solo uno. Y como en cualquier otra línea de Perl, cada elemento se evalúa como si fuera una expresión, así que en nuestro caso, incrementamos una variable. Mejor dicho: es un post-incremento, así que primero nos quedamos con el valor de la variable y luego la incrementamos.

Finalmente, se hace el proceso inverso: el valor de la variable se convierte en elemento de un array anónimo, que es desferenciado con las llaves y la arroba, con lo que el resultado neto es... el propio valor de la variable.

En cuanto a la siguiente pregunta, quizás lo resuelvas con un simple sort. Algo así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. opendir(my $DIR, $imageDir);
  2. my @figs = sort readdir $DIR;
  3. closedir $DIR;
  4.  
  5. for my $fig (@figs) {
  6.     if ($fig =~ /(?<fig>$name-fig-)(?<num>\d+)$ext/) {
  7.         # split con GS
  8.         print "Creando $imageDir/$name-fig-$+{num}.pdf\n";
  9.      
  10.         system ("gs -q -sDEVICE=pdfwrite -dFirstPage=$+{num} -dLastPage=$+{num} -o $imageDir/$+{fig}$+{num}.pdf $imageDir/$name-fig.pdf");
  11.      
  12.         # PNG format
  13.         if ($png) {
  14.             system("gs -q -sDEVICE=pngalpha -r$DPI $opt_gs_raw -o $imageDir/$+{fig}$+{num}.png $imageDir/$+{fig}$+{num}.pdf");
  15.         }
  16.     }
  17. } #for
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para texto anidado

Notapor pablgonz » 2015-01-13 22:01 @959

Muchísimas gracias por la clase, ahora entiendo un poco más. La documentación de Perl es bastante extensa y un poco confusa para principiantes.
Saludos
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados