Bueno.. les comento mi problema.
Tengo que parsear unos logs del Apache, la parte de expresiones regulares la aprendí googleando y de algunos tutoriales.
Resulta que en mi script de Perl hago casi todas las cosas que necesito. Mi script recibe como parámetro un log y de ese log busca keys para generar un "archivotemporal" . Ese archivo tiene la siguiente estructura:
- Código: Seleccionar todo
20080723 221746 260 433 miweb.com
20080723 220049 260 433 lacasa.com
20080723 132219 300 500 yo.com
20080723 175419 300 500 sss2.com
20080723 214433 260 433 yodenuevo.com
20080723 221835 300 500 unknown
20080723 208982 260 433 tagged.com
20080723 49084 260 433 myspace.com
Todos separados por un espacio.
Donde:
* el primer campo es la fecha 2008 -07 -23
* el segundo es el ID del usuario
* el tercero y cuarto son el tamaño de su foto
* y el quinto es la web personal.
A ese "archivotemporal" lo vuelvo a parsear dentro de mi script con una función que me cuenta las veces que se repite cada línea (ordenadas). La función es la siguiente:
Using perl Syntax Highlighting
sub count_lines($$)
{
my $filename = shift;
my $outputfile = shift;
%seen = ();
open(INPUT,$filename) || die("Could not open input file stage 2");
open(OUTPUT,"> $outputfile") || die("Could not open output file stage 2");
while(<INPUT>)
{
while (/^(.*)$/g)
{
$seen{ lc $1 }++;
}
}
foreach $line ( sort { $seen{$b} <=> $seen{$a} } keys %seen )
{
print OUTPUT "$line $seen{$line}\n";
}
close(INPUT);
close(OUTPUT);
}
{
my $filename = shift;
my $outputfile = shift;
%seen = ();
open(INPUT,$filename) || die("Could not open input file stage 2");
open(OUTPUT,"> $outputfile") || die("Could not open output file stage 2");
while(<INPUT>)
{
while (/^(.*)$/g)
{
$seen{ lc $1 }++;
}
}
foreach $line ( sort { $seen{$b} <=> $seen{$a} } keys %seen )
{
print OUTPUT "$line $seen{$line}\n";
}
close(INPUT);
close(OUTPUT);
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Pero resulta que esa función en algún momento de su ejecución me escribe en OUTPUT cualquier cosa... pero cualquier cosa.
Ejemplo:
- Código: Seleccionar todo
20080723 97782 260 433 msappspace.com 1
20080723 192535 260 433 tagged.com 1
20080723 116064 300 500 hi5.com 1
20080723 81657 300 500 tagged.com 1
20080723 214433 0 1 <------------------------------- Esta línea está mal
20080723 216642 300 500 msappspace.com 1
20080723 106863 260 433 tagged.com 1
20080723 1449 260 433 tagged.com 1
A todos esos datos los cargo en una base de datos. Todo funcionaba bien en un principio. Obviamente el script no anda... porque cuando quiero insertar en MySQL los logs, existen campos vacíos :S
Probé con muchos logs diferentes, aveces pasa y aveces no (si pasa con un log, siempre lo hace por más que probemos miles de veces más).
¿Algún consejo?... estuve toda la tarde intentando cambiar cosas... pero nada me resulto :S
Saludos
Nacho