Los paréntesis en los open() están mal: están rodeando a los die(), cuando en realidad los die() debería estar fuera de la operación open().
Si creo que lo he entendido, sería algo así (no probado):
Using perl Syntax Highlighting
#!/usr/bin/perl
my @actividades = qw(
concierto cine
futbol basquetbol
desfile
);
open(IN, "<D:/etc/ticketsven.txt") or die "ERROR: No puedo abrir el archivo: $!\n";
while (my $linea = <IN>) {
for my $actividad (@actividades) { # recorremos todas las actividades
if ($linea =~ /$actividad/) { # ¿está la $actividad dentro de la $linea?
open( OUT, ">>D:/etc/$actividad.txt" ); # sí, abrimos el archivo correspondiente, en modo añadir
print OUT $linea; # guardamos la $linea
close OUT;
last; # no hace falta seguir mirando más actividades
}
}
}
close IN;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Vamos leyendo por líneas; por cada una, la comparamos con todas las actividades, y cuando alguna coincide, grabamos la línea en el archivo de la actividad.
Esto no es nada eficiente. Se puede mejorar:
- si sabemos cómo es la estructura interna del archivo que estamos leyendo
- si antes del bucle abrimos todos los archivos en los que vamos a escribir
Otra forma de hacerlo sería usando grep() (no probado):
Using perl Syntax Highlighting
#!/usr/bin/perl
my @actividades = qw( # recordamos las actividades que nos interesan
concierto cine
futbol basquetbol
desfile
);
open( IN, "<D:/etc/ticketsven.txt" ) or die "ERROR: No puedo abrir el archivo: $!\n";
my @lineas = <IN>; # leemos todas las líneas
close IN;
for my $actividad (@actividades) { # recorremos todas las actividades
open OUT, ">>D:/etc/$actividad.txt"; # abrimos el archivo correspondiente, en modo añadir
print OUT grep { /$actividad/ } @lineas; # guardamos en él todas las @lineas que coincidan con la $actividad
close OUT;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4