• Publicidad

Operaciones varias en un archivo

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

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 08:17 @386

La salida correcta sería de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
nombre1 1       76      n=3
nombre2 12      72      n=2
nombre2 145     184     n=3
nombre3 26      75      n=2
nombre4 104     201     n=3
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Publicidad

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 11:30 @521

El código de creating021 sólo compara los nombres (primera cadena), necesito que también verifique si la diferencia entre las segundas cadenas es menor a 50.

Y que imprima en el archivo de salida el nombre las coordenadas de inicio y fin y el número de "hit" que hay.

Eso me complica porque es como una doble condición :S
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Operaciones varias en un archivo

Notapor explorer » 2011-01-17 11:38 @526

He hecho un programa, siguiendo las reglas -creo-, y me sale esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
nombre1 1       76      n=3
nombre2 12      72      n=2
nombre2 145     184     n=3
nombre3 26      75      n=2
nombre4 62      201     n=4
nombre5 10      45      n=1
Coloreado en 0.000 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 11:44 @530

Claro, debe salir exactamente eso, pero en el caso de nombre5 no debe ir, ya que no cumple con ambas condiciones.

Bueno, la verdad es mi primer intento con Perl y al parecer no elegí una tarea muy fácil :S.
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Operaciones varias en un archivo

Notapor explorer » 2011-01-17 11:55 @538

A ver si nos aclaramos...

Te he dado la salida de mi programa y dices que es correcta... en cambio, es distinta (en nombre4) a la salida que has indicado en el anterior mensaje.

Y nombre5 sí que cumple con las condiciones: son dos líneas en las cuales tienen el mismo nombre y la segunda columna difiera en más de 50 con la siguiente, por lo que debe imprimir el último valor correcto de la tercera columna...

¿Podemos aclararnos con las reglas? :?
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: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 12:01 @542

¡Huy, si! Lo siento mucho, es que al escribir el archivo que debería tener como salida me pase por alto la diferencia que existía en nombre4; y lo otro es que justamente de la forma que tu lo hiciste aparece nombre5 porque cumple una de las condiciones, pero la idea es que cumpla ambas condiciones simultáneamente, es decir, tengan el mismo nombre y la diferencia entre coordenadas iniciales sean menor a 50.

Lamento no haberme explicado bien :(
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Operaciones varias en un archivo

Notapor explorer » 2011-01-17 12:23 @558

Bueno, creo que más o menos entiendo las reglas... entonces, una posible solución sería esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. # Joaquin Ferrero 20100117
  4. #
  5. use common::sense;
  6.  
  7. # Necesito que si la línea i con la siguiente tienen el mismo nombre y la
  8. # diferencia entre las columnas 2 de la línea i y la siguiente es menor que 50
  9. # contabilice y guarde el nombre y columna 2 de i y continúe comparando hasta
  10. # que la diferencia sea mayor que 50 o los nombres sean distintos y guarde la
  11. # columna 3 de la última linea en la que se cumplían las condiciones.
  12. #
  13. #    nombre1 1       76      n=3
  14. #    nombre2 12      72      n=2
  15. #    nombre2 145     184     n=3
  16. #    nombre3 26      75      n=2
  17. #    nombre4 62      201     n=4
  18.  
  19. my ($n, $nombre_anterior, $columna_2_primera, $columna_2_anterior, $columna_3_anterior)
  20.     = (0) x 5;
  21.  
  22. while (my $línea_actual = <DATA>) {
  23.     my ($nombre, $columna_2, $columna_3) = split " ", $línea_actual;                # extraemos los componentes
  24.  
  25.     if ($nombre eq $nombre_anterior  and  $columna_2 - $columna_2_anterior < 50) {  # si los nombres son iguales y
  26.                                                                                     # si la diferencia es < 50        
  27.             $n++;                                                                   # estamos en bloque: contamos una línea más
  28.     }    
  29.     else {                                                                          # sino,
  30.         say "$nombre_anterior\t$columna_2_primera\t$columna_3_anterior\tn=$n"       # imprimimos la línea
  31.             if $n > 1;                                                              #    salvo que solo hayamos contado una sola
  32.  
  33.         $columna_2_primera = $columna_2;                                            # recordamos para el siguiente bloque
  34.         $n = 1;                                                                     # iniciamos contador de bloque
  35.     }
  36.  
  37.     $nombre_anterior    = $nombre;                                                  # recordamos componentes de la línea anterior
  38.     $columna_2_anterior = $columna_2;
  39.     $columna_3_anterior = $columna_3;
  40. }    
  41.  
  42. __DATA__
  43. nombre1  1   10
  44. nombre1  25  30
  45. nombre1  45  76
  46. nombre2  12  23
  47. nombre2  38  72
  48. nombre2 145  158
  49. nombre2 163  181
  50. nombre2 176  184
  51. nombre3  26   38
  52. nombre3  42   75
  53. nombre4  62   89
  54. nombre4 104  195
  55. nombre4 132  158
  56. nombre4 165  201
  57. nombre5 10    45
  58. nombre5 163   189
Coloreado en 0.003 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 12:29 @562

Disculpa molestarte de nuevo, pero, el "say", ¿para qué sirve? No lo había visto antes :D
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 12:30 @562

Estaba comentado :S ¡cuek sorry!
Y gracias :)
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

Re: Operaciones varias en un archivo

Notapor Marielago » 2011-01-17 12:40 @569

Tengo una duda, más bien una línea que no comprendo, no sé si me podrías ayudar.

my ($n, $nombre_anterior, columna_2_primera, $columna_2_anterior, $columna_3_anterior) = (0) x 5;

¿Qué es exactamente lo que hace en esta línea?
Marielago
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-01-14 08:26 @393

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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