• Publicidad

File::SortedSeek::get_between()

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

File::SortedSeek::get_between()

Notapor rfm » 2007-11-27 04:14 @218

Hola a todos.

Tengo un problema a la hora de usar esta función sobre un fichero.

Tengo el código siguiente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
######################################
use File::SortedSeek ':all';

open DATOS,'./datos.log' or die $!;
$begin=alphabetic(*DATOS,'2007-11-26');
$end=alphabetic(*DATOS,'2007-11-31');
@lineas=get_between(*DATOS,$begin,$end);
close(DATOS);
######################################
 
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

En teoría se deberían cargar en el array @lineas todas las líneas del log comprendidas entre $begin y $end, pero a la hora de mirar el array si $begin es la primera línea del log no me la carga o si $begin es la 2ª línea del log me coge también la anterior, unas cosas muy raras.

¿Puede ser por el formato del log? ¿o por un mal uso de la función?

El log tiene el siguiente formato:

Código: Seleccionar todo
2007-11-26 21 312  421
2007-11-27 1 32  21
2007-11-28 2 31  41
2007-11-29 23 32  41
2007-11-30 31 12  41
2007-11-31 61 32  21


Muchísimas gracias por vuestro interés.
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Publicidad

Notapor explorer » 2007-11-27 07:30 @354

Ya encontré el fallo.

Resulta que el módulo File::SortedSeek hace comparaciones exactas con lo que pedimos que busque, y claro, le estás pidiendo que busque por una fecha, pero las líneas del log tienen más cosas que una fecha.

Por eso, en algunas ocasiones te daba una línea distinta, porque el módulo intenta buscar la línea más semejante, en caso de no poder encontrar la más exacta.

La solución pasa por indicar al módulo que use nuestra propia rutina de comparación. Mejor dicho, le pasaremos una rutina que extrae el elemento que el módulo debe usar para hacer la comparación.

En nuestro caso, se trata de sacar el campo de la fecha.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use File::SortedSeek ':all';

#File::SortedSeek::set_debug();

sub comparacion {
  my $linea  = shift;             # Línea a comparar
  my @campos = split " ", $linea; # Los campos están separados con espacios
  return $campos[0];              # Solo nos interesa el primer campo de la línea
}


open DATOS,'./kk.txt' or die $!;

$begin  = alphabetic(*DATOS,'2007-11-19', \&comparacion);
$end    = alphabetic(*DATOS,'2007-12-01', \&comparacion);

@lineas = get_between(*DATOS,$begin,$end);

close(DATOS);

print join "\n", @lineas;

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Ves que, además de la fecha que buscamos, le pasamos una referencia a la subrutina &comparacion, que se encarga de extraer el campo con el cual el módulo debe realizar las búsquedas.

He hecho varias pruebas y ahora sí que encuentra las líneas correctas. ¡Prueba!
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 rfm » 2007-11-27 08:12 @384

¡Muchas gracias explorer!

Ya estaba modificando el código de la subrutina get_between(), pero sin ningún éxito.

Saludos.
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Notapor rfm » 2007-11-27 08:49 @409

He probado lo que me has dicho en el mensaje anterior y no me carga nada en el array.

¿Tengo que instalar alguna otra función?

Por lo visto no me llama bien a la subrutina comparación.

¿Le tengo que pasar algún parámetro a la subrutina dentro del $begin=alphabetic(*DATOS,$start,\&comparacion(¿algún parámetro?))??

Saludos
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Notapor explorer » 2007-11-27 09:13 @426

Yo no he dicho nada de modificar la función get_between, del módulo.

Con el fichero de log que has enseñado antes, y con el programa que te he presentado, a mí sí que me funciona. No es necesario pasarle ningún parámetro a la función de extracción. El módulo la llama pasándola la línea a comparar y se espera que devuelva el campo a comparar con lo que le indicas en $start.

En la documentación del módulo comentan algo de los finales de línea. Quizás sea eso.

Para comprobar que llama a &comparacion, pon algún print dentro de ella, como por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  print "Leyendo $linea\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
siendo $linea la línea que nos pasa como argumento.
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


Volver a Intermedio

¿Quién está conectado?

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