Página 2 de 4

NotaPublicado: 2007-04-24 18:11 @799
por rochi
Si cambié la expresión, pero aún no doy en la tecla.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(\w+ = )([^P].*[^Z]$?)(\s*)';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que necesito es $2, lo que está después del "=". Al considerar /exp/s se supone que el "." considera también los blancos hasta que alcanza una Z antes del fin de línea.

Y aqui 'matcheo':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /$expreg/gsi)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todos modos sigo sin comprender. Susana Gonzalez lo toma correctamente, pero a Pablo Jara no, y lo es, y Pirez Corrales lo toma como no válido y lo es; el nombre completo finaliza en 'a', no en 'z'.
Pablo Gomez lo filtra bien.

Saludos

NotaPublicado: 2007-04-24 19:55 @872
por explorer
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

@lineas = (
  'nombre = Pablo Gomez',
  'nombre = Pablo Sasz',
  'nombre = Paz Ada Rodriguez',
  'nombre = Susana Gonzalez',
  'nombre = Ema Sanchez',
  'nombre = lucia rodriguez',
  'nombre = Virginia Olague',
  'nombre = Pirez Corrales',
);

foreach $linea ( @lineas ) {

    if ( $linea !~ /= (p.*z)$/i ) {
        print "$1\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que hacemos es justo lo que rochi ha pedido: la $linea no ha de coincidir (!~) con el patrón de un '= ' seguido por un nombre que comienza por 'p' y termina ($) por una 'z'.

El truco está en usar el '= ' como ancla de posición para indicar dónde queríamos ver si estaba la 'p'.

NotaPublicado: 2007-04-24 21:43 @946
por rochi
Para imprimir el $1 tengo problemas, está vacío, supongo que es porque al no respetar el patrón, no hay nada que comience con p y termine con z.
Por el momento lo solucioné así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea !~ /$expreg/si)
   {
         if ($linea !~ /$expreg/i)
       {
              if ($linea =~ /(=\s*)(.*)(\s?$)/)
                 {
                      $lin = $lin.$2."\t";
                      $aux = $3;
                  }
}    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aclaro que concateno porque la salida, cada 4 renglones debe la información desplegarse en el mismo renglón, por la lógica de la información. Obvié esos detalles de algoritmia que sí me funcionan.
Lo que no funciona es que a veces necesito imprimir el valor de $3. O sea lo que siga después de la palabra, ya sea nada o una nueva línea. Si no pongo el valor en $aux, cuando $3 no tiene nada sale un msg diciendo que la misma no fue inicializada. Almacenando el valor en $aux no tengo ese problema. ¿Qué alcance tienen estas variables?
¿Cómo saber si $3 es 'null'? (así sé cuándo imprimirlo)
La solución con $aux me funciona a medias, por momentos agrega un \n que no debería aparecer.


Gracias por la ayuda que me has venido dando.

No entiendo qué está mal en esta expresión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(\w*\s*=\s*)(^[^p].*[^z]$)';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Quiero tomar $2, lo que no comience con p y ni termine con z.

Saludos, ro

NotaPublicado: 2007-04-25 02:18 @137
por explorer
En el código, has puesto dos veces la misma condición. Con la primera condición, es suficiente.

El obviar detalles es crucial para dar una respuesta, sobre todo en Perl. El lenguaje es potente, pero no tanto como para distinguir detalles.

El alcance de las variables normales es en el del contexto en que se definen. El alcance de las variables numéricas ($1, $2, ...) también es el del contexto, salvo que son modificadas en cada expresión regular que tenga éxito.

Para saber si $3 es nula, pues eso mismo: if ( ! $3 ) { ...}

Para saber lo que está mal de la expresión regular hay que ver antes un ejemplo de la entrada, o al menos, detallarla.

NotaPublicado: 2007-04-27 09:39 @443
por rochi
Repaso el problema, filtrar nombres completos que comiencen con 'P' y terminen con 'z'.
Por ejemplo: Pablo Gomez, Pilar Rodriguez, deben ser filtrados.
En cambio Luis Fuentes, Paz Abate deben ser aceptados.
Pues bien eso me funciona. Pero cuando hago una comparación de lo que se pretende sea el archivo de salida y el mío (usando diff)
Me sale:
1,5c1,5
Contenido de los 2 archivos (que es idéntico) y al final de c/u la frase:
No new line at end of file.

Los nombres vienen por filas, y la ultima no tiene \n.

Código que uso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(=\s*)(p.*z)\s*$';

if ($linea !~ /$expreg/si)
   {
         if ($linea !~ /$expreg/i)
       {
              if ($linea =~ /(=\s*)(.*)(\s*$)/)
                 {
                      $lin = $lin.$2."\t";
                      $aux = $3;
                  }
}    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
saludos, gracias

NotaPublicado: 2007-04-27 11:16 @511
por explorer
A mi me sigue funcionando mi primera solución...

Es mejor que pongas aquí un ejemplo de la entrada que quieres procesar y un ejemplo de la salida.

NotaPublicado: 2007-04-27 12:19 @555
por rochi
Hola bien, aqui va, y muchísimas gracias.

Entrada:
Código: Seleccionar todo
nombre = Pablo Perez
parcial1 = 86
obligatorio1 = 33
parcial2 = 77
obligatorio2 = 43
nombre = Pablo Sanchez
parcial1 = 98
obligatorio1 = 85
parcial2 = 35
obligatorio2 = 85
nombre = Susana Gonzalez
parcial1 = 91
obligatorio1 = 80
parcial2 = 0
obligatorio2 = 0
nombre = pablo RodrigueZ
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8
nombbbbbre = Ema Sanchez
parcial1 = 9
obligatorio1 = 33
parcial2 = 31
obligatorio2 = 8
nombre = Pablo Sasz
parcial1 = 86
obligatorio1 = 33
parcial2 = 77
obligatorio2 = 43
nombre = Pablo Sanchez
parcial1 = 98
obligatorio1 = 85
parcial2 = 35
obligatorio2 = 85
nombre = Paz Ada Lopez
parcial1 = 91
obligatorio1 = 80
parcial2 = 0
obligatorio2 = 0
nombre = lucia rodriguez
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8
nombbbbbre = Virginia Olague
parcial1 = 1
obligatorio1 = 34
parcial2 = 30
obligatorio2 = 43
nombre = Pirez  Corrales
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8

Salida: (sale bien)
Código: Seleccionar todo
Susana Gonzalez   91   80   0   0
Ema Sanchez   9   33   31   8
lucia rodriguez   18   5   7   8
Virginia Olague   1   34   30   43
Pirez  Corrales   18   5   7   8


El resultado es correcto, salvo lo que indica el diff, muestra el contenido de mi salida y la salida oficial (ambos idénticos), con el sig msg al final de c/archivo.
Código: Seleccionar todo
1,5c1,5
No new line at end of file.

NotaPublicado: 2007-04-27 14:44 @655
por explorer
Es posible que justamente falte un avance de línea al final del programa.

NotaPublicado: 2007-04-27 15:46 @698
por rochi
Si había probado forzándolo y escribiendo un
Código: Seleccionar todo
print "\n"
al final del código y el problema sigue.

Por otra parte si mi codigo es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /(=\s*)(.*)(\s*$)/)
   {
        $lin = $lin.$2."\t";
        $aux = $3;
   }
.....
print "$lin";
print "$aux";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¿ya no estaría cubierto el \n en la variable $aux?, puesto que almacena lo que queda en (\s*$) o $3, dudas....

Gracias, saludos

NotaPublicado: 2007-04-27 19:25 @851
por explorer
Entonces es posible que a quien le falte el \n sea al fichero de salida original con el que estás haciendo la comparación, no el fichero resultado de tu programa.