Página 1 de 1

Modulo Find

NotaPublicado: 2005-09-26 11:54 @538
por julruiz
Me he leido el tutorial del modulo File, y me ha funcionado a la perfección, sin embargo modifique el codigo para que todos los archivos que encuentre en un directorio no me los muestre en pantalla, sino que los guarde en un archivo, el siguiente es el codigo que implemente...

#!C:\perl\bin\perl.exe -w

use strict;
use File::Find;

my $dir='c:/Perl/lib/';
find(\&listado_archivos,$dir);

sub listado_archivos {
open ARCHIVOS,">archivos.txt";
my $elemento=$_;
print ARCHIVOS "$File::Find::name\n";
close(ARCHIVOS);
}


pero al ejecutarlo no me guarda el listado de todos los archivos sino el ultimo que encontro...

como hago para que me funcione correctamente?

gracias..

NotaPublicado: 2005-09-26 14:45 @656
por explorer39
Cambia de sitio un par de líneas y quita otra que sobra...
Código: Seleccionar todo
#!C:\perl\bin\perl.exe -w

use strict;
use File::Find;

my $dir='c:/Perl/lib/';
open ARCHIVOS,">archivos.txt";
find(\&listado_archivos,$dir);
close(ARCHIVOS);

sub listado_archivos {
print ARCHIVOS "$File::Find::name\n";
}
Resulta que File::Find ejecuta la función listado_archivos por CADA fichero que encuentre en el directorio.
Lo que tenías puesto era que cada vez que encontraba un fichero, abrías el fichero de salida en modo escritura, y claro, la siguiente búsqueda sobreescribía a la anterior.
Ahora, lo que hace es abrir el fichero, buscar -y por cada uno que encuentra, hace un print-, y luego lo cierra.

gracias y otra pregunta

NotaPublicado: 2005-09-27 16:20 @722
por julruiz
gracias... me ha funcionada a la perfeccion....

pero tengo otra duda... a continuacion el codigo...

&links;
&imagenes;

#funcion que guarda en un archivo los links de una pagina
sub links {
open FILE,"pagina.txt";
open LINKS,">links.txt";

while(my $line=<FILE>) {
if(my @links=$line=~/(\<a.*?\/a\>)/ig)
{
print LINKS "$_\n" foreach @links;
}
}
close(LINKS);
close(FILE);
}

#funcion que guarda en un archivo las imagenes de una pagina
sub imagenes {
open FILE,"pagina.txt";
open IMG,">imagenes.txt";

while(my $line=<FILE>) {
if(my @imagenes=$line=~/(\<img.*?\>)/ig)
{
print IMG "$_\n" foreach @imagenes;
}

}
close(IMG);
close(FILE);
}


en el anterior codigo tengo dos rutinas una para detectar los links y la otra para detectar las imagenes de una pagina... pero lo que no me gusta del codigo es que en cada subrutina me toca abrir el archivo pagina.txt.... ya que si lo hago de la siguiente manera ...

open FILE,"pagina.txt";
&links;
&imagenes;
close(FILE);


solo me detecta los links... como hago para que cuando llame a la rutina imagenes esta tome el archivo pagina.txt pero desde la primera linea pero sin tener que volver a abrirlo....

gracias

NotaPublicado: 2005-09-27 17:59 @791
por kidd
Hola:

Podrías intentar lo siguiente:

Código: Seleccionar todo
open FILE,"pagina.txt";
links();
   seek(FILE,1,0);  #Regresa a la primera posición de <FILE>
imagenes();
close(FILE);



NOTA: Es de buen uso que cuando hagas las llamadas de tus funciones uses nombre_funcion(), en vez de &nombre_funcion;

SALUDOS

Gracias

NotaPublicado: 2005-09-27 22:53 @995
por julruiz
Hey excelente era justo lo que necesitaba....

Modulo find

NotaPublicado: 2005-10-17 11:44 @530
por julruiz
Hola a todos...

Me he leido el tutorial del modulo find, y todo me ha salido bien...

pero necesito guardar en una variable solo la ruta de un directorio, en otro el nombre del archivo y en otra variable el tamaño del archivo...

como lo hago?

NotaPublicado: 2005-10-17 11:52 @536
por explorer39
Yo utilizaría el módulo File::Basename para eso. Y en cuanto al tamaño, usa el operador -s.