• Publicidad

Acotar expresión regular

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

Re: Añadir coma opcional en expresión regular

Notapor pablgonz » 2013-11-26 13:53 @620

Muchas gracias, el cambio que propones funciona a la perfección. Consulta (para variar) ¿Por qué falla si el archivo de entrada está desordenado? Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \begin{example}[algo1=2, 
  2.                 algo2=3, 
  3.                 algo3=\?] 
  4.                  
  5. \includegraphics[scale=1]{archivo-fig-3} 
  6. \end{example} 
¿Qué debo modificar? Y creo que estoy capturando elementos innecesarios dentro de la expresión regular, como los [...] al inicio y las {...} después.

Salu2
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Añadir coma opcional en expresión regular

Notapor explorer » 2013-11-26 15:11 @674

Debes agregar la opción /s al final de la expresión regular.

Más información en tu propio ordenador en perldoc perlre, y en la Web (traducido al español).
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

Re: Acotar expresión regular

Notapor pablgonz » 2013-11-26 17:38 @776

Excelente enlace (no me lo había topado por google), "/s" funciona a la perfección.

Muchas gracias por la ayuda.
Pablo.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor pablgonz » 2014-02-03 02:25 @142

Para no abrir un nuevo hilo, coloco mi problema aquí. Al actualizar Perl a la versión 5.18.2 me percato que el script ya no funciona como antes.

Buscando en los foros, me percato de las advertencias que da esta versión con el uso de given/when, lo cual se puede saltear añadiendo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. no if $] >= 5.018, warnings => "experimental::smartmatch";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
el tema es que el script ya no funciona del todo bien, intenté cambiando el código a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Cambiar
  2. while (
  3.     $cuerpo =~ /   $marca
  4.                |   $comentario
  5.                |   $definedel
  6.                |   $indefinedel
  7.                |   $del .+? $del                                                           # delimitado
  8.                /gimx
  9.     ) {
  10.  
  11.     my ( $pos_inicial, $pos_final ) = ( $-[0], $+[0] );    # posiciones
  12.     my $encontrado = ${^MATCH};        # lo encontrado
  13.  
  14.     if ( $encontrado eq /$definedel/ ) {                   # definimos delimitador
  15.         $del = $+{del};
  16.         $del = "\Q$+{del}" if substr( $del, 0, 1 ) ne '\\';    # es necesario "escapar" el delimitador
  17.     }
  18.     elsif ( $encontrado eq /$indefinedel/ ) {    # indefinimos delimitador
  19.         $del = $no_del;
  20.     }
  21.     else {                             # Aquí se hacen los cambios
  22.         while ( my ( $busco, $cambio ) = each %cambios ) {
  23.  
  24.             $encontrado =~ s/\Q$busco\E/$cambio/g;   # es necesario escapar $busco, ya que contiene caracteres extraños
  25.         }
  26.  
  27.         substr $cuerpo, $pos_inicial, $pos_final - $pos_inicial, $encontrado;    # insertamos los nuevos cambios
  28.  
  29.         pos($cuerpo) = $pos_inicial + length $encontrado;    # re posicionamos la siguiente búsqueda
  30.     }
  31. }
  32.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
lo cual creo que está correcto, pero no obtengo el resultado esperado.

Si quito la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.16;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
strict me arroja errores en las líneas donde se encuentra given/when, entonces, ¿cuáles son los cambios que debo hacer para cambiar given/when a if/elsif/else?

Mi idea es dejar el script sin given/when (u otra característica experimental de ser posible) puesto que será quitado o modificado en la versión 5.20 (acorde a lo que entendí en los foros que busqué) por lo tanto, prefiero escribir el código usando if/elsif/else para no tener problemas en el futuro.

Saludos,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor explorer » 2014-02-03 07:31 @355

No hay cambios extraños en el motor de las expresiones regulares, así que debería funcionar igual que antes. Yo tengo docenas de programas que no he tenido que retocar.

EL given/when sí que va a seguir. Lo que es problemático es el funcionamiento del SmartMach, que ha cambiado un poco. Y como given/when depende de SmartMach, pues... lo mismo.

Si quieres quitarlo, debes entender lo que cómo funciona given/when.

En given() se indica la variable que queremos probar.
Y en when(), los valores con los que queremos comprobar si coinciden con la variable anterior.

Por ejemplo:

given($a) {
when('a') {
...;

se puede cambiar a un sencillo

if ($a eq 'a') {
...;

Hay otras situaciones en la que no vale un cambio tan sencillo. Recuerda que se usa SmartMach, así que a veces hay que sustituirlo por una serie de líneas. Sobre todo si la comparación incluye buscar coincidencia entre un valor dentro de un array o un hash. En perldoc perlop se describe lo que hace SmartMach en cada situación, y un ejemplo de código al que sustituye.

Si quitas el use v5.16 es normal que aparezcan errores en los given/when, porque entonces esas palabras no son reconocidas en la versión de Perl (al no poner use v5.16, perl trabaja como si fuera una versión anterior a v5.10).
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

Re: Acotar expresión regular

Notapor pablgonz » 2014-02-03 08:00 @375

Gracias por la respuesta y explicación, decidí cambiar el código porque tal como estaba no me funcionaba, pensé que era el uso de given/when con la modificación que realizé debería funcionar. Si cambio "eq" por "~~" funciona... pero...no sé por qué.

Saludos,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor pablgonz » 2014-02-03 16:37 @734

explorer escribiste:No hay cambios extraños en el motor de las expresiones regulares, así que debería funcionar igual que antes.
Eso es lo extraño, leí las novedades de Perl 5.18 en las noticias del foro, de los cambios que están comentados, no distingo cuál es el que está interfiriendo.

explorer escribiste:El given/when sí que va a seguir. Lo que es problemático es el funcionamiento del SmartMach, que ha cambiado un poco. Y como given/when depende de SmartMach, pues... lo mismo.
Ok, si tú lo dices... es así.

explorer escribiste:Si quieres quitarlo, debes entender lo que cómo funciona given/when... Por ejemplo:
given($a) {
when('a') {
...;
se puede cambiar a un sencillo
if ($a eq 'a') {
...;
...En perldoc perlop se describe lo que hace SmartMach en cada situación, y un ejemplo de código al que sustituye.
Ok, me leí la documentación y rebusqué un rato por el foro y al final dejé el código así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use autodie;
  3. use v5.14;
  4. no if $] >= 5.017011, warnings => 'experimental::smartmatch';
  5.  
  6. ## Cambiar
  7. while (
  8.     $cuerpo =~ /   $marca
  9.                |   $comentario
  10.                |   $definedel
  11.                |   $indefinedel
  12.                |   $del .+? $del                           # delimitado
  13.                /gimx
  14.     ) {
  15.  
  16.     my ( $pos_inicial, $pos_final ) = ( $-[0], $+[0] );    # posiciones
  17.     my $encontrado = ${^MATCH};        # lo encontrado
  18.  
  19.     if ( $encontrado ~~ /$definedel/ ) {                   # definimos delimitador
  20.         $del = $+{del};
  21.         $del = "\Q$+{del}" if substr( $del, 0, 1 ) ne '\\';    # es necesario "escapar" el delimitador
  22.     }
  23.     elsif ( $encontrado ~~ /$indefinedel/ ) {    # indefinimos delimitador
  24.         $del = $no_del;
  25.     }
  26.     else {                             # Aquí se hacen los cambios
  27.         while ( my ( $busco, $cambio ) = each %cambios ) {
  28.  
  29.             $encontrado =~ s/\Q$busco\E/$cambio/g;   # es necesario escapar $busco, ya que contiene caracteres extraños
  30.         }
  31.  
  32.         substr $cuerpo, $pos_inicial, $pos_final - $pos_inicial, $encontrado;    # insertamos los nuevos cambios
  33.  
  34.         pos($cuerpo) = $pos_inicial + length $encontrado;    # re posicionamos la siguiente búsqueda
  35.     }
  36. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
No sé si está del todo correcto, no encontré un equivalente a ~~, ya que eq no me funciona con el hash. Probé el código con Perl v5.16 y v5.18 y funciona como deseo. Un par de consultas (para variar):
  • ¿Está bien escrito el código?
  • ¿Existe algún equivalente a ~~?
  • ¿Porque el código original dejó de funcionar en Perl v5.18?
Agradecido de los comentarios y ayuda, se despide,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor explorer » 2014-02-03 17:55 @788

En los dos if() donde usas '~~' estás buscando un patrón en una variable escalar, así que lo puedes dejar así: una simple expresión regular.

if ( $encontrado =~ /patrón/ ) {
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

Re: Acotar expresión regular

Notapor pablgonz » 2014-02-03 20:21 @889

Genial, era justo lo que deseaba...explorer eres un maestro en Perl.
Gracias absolutas.

P.D.: Sigo pensando en por qué dejó de funcionar, tal cual estaba. el script, ¿será por qué lo probé en una máquina con win32?
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Acotar expresión regular

Notapor explorer » 2014-02-04 12:55 @580

No sé. Habría que ver los errores que saliesen en pantalla. O ver qué comportamiento tiene, para acotar en qué parte del programa falla.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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