Mar Nov 27, 2007 3:14 am
|
 |
rfm
Perlero Nuevo

|
Registrado: 09 Nov 2007
Mensajes: 37
|
|
| File::SortedSeek::get_between() |
|
|
Hola a todos.
Tengo un problema a la hora de usar esta función sobre un fichero.
Tengo el código siguiente.
| Perl: | ######################################
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 );
######################################
|
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: |
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. |
|
|
|

Mar Nov 27, 2007 6:30 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
|
|
|
|
|
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.
| Perl: | #!/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__ |
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! |
|

Mar Nov 27, 2007 7:12 am
|
 |
rfm
Perlero Nuevo

|
Registrado: 09 Nov 2007
Mensajes: 37
|
|
|
|
|
¡Muchas gracias explorer!
Ya estaba modificando el código de la subrutina get_between(), pero sin ningún éxito.
Saludos. |
|
Mar Nov 27, 2007 7:49 am
|
 |
rfm
Perlero Nuevo

|
Registrado: 09 Nov 2007
Mensajes: 37
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|