2010-02-02 15 views
6

Duplicar posible:
How do I pass parameters to the File::Find subroutine that processes each file?¿Cómo puedo pasar un parámetro a la función deseada cuando uso Perl's File :: Find?

Uno puede utilizar el módulo de Perl File::Find así:

find(\&wanted, @directories); 

¿Cómo podemos añadir un parámetro a la función wanted?

Por ejemplo, quiero recorrer los archivos en /tmp extrayendo algo de información de cada archivo y el resultado debe almacenarse en un directorio diferente. El dir de salida debe darse como un parámetro.

+0

Por favor describa más específicamente lo que está tratando de hacer y voy a actualizar mi respuesta. –

+0

Vea también http://stackoverflow.com/questions/2056649/how-do-i-pass-parameters-to-the-filefind-subroutine-that-processes-each-file –

+0

@ Sinan Ünür su comentario http://stackoverflow.com/questions/2056649/how-do-i-pass-parameters-to-the-filefind-subroutine-that-processes-each-file ha resuelto la pregunta. si lo publica como respuesta lo marcaré como aceptado – jojo

Respuesta

10

utiliza un cierre:

use File::Copy; 

my $outdir= "/home/me/saved_from_tmp"; 
find(sub { copy_to($outdir, $_); }, '/tmp'); 

sub copy_to 
    { my($destination_dir, $file)= @_; 
    copy $file, "$destination_dir/$file" 
     or die "could not copy '$file' to '$destination_dir/$file': $!"; 
    } 
3

File::Find El contrato especifica qué información se pasa a &wanted.

La función deseada no toma argumentos, sino que hace su trabajo a través de una colección de variables.

  • $File::Find::dir es el nombre del directorio actual,
  • $_ es el nombre del archivo actual dentro de ese directorio
  • $File::Find::name es la ruta completa al archivo.

Si hay alguna información adicional que desee que estén disponibles en la devolución de llamada, puede create a sub reference that calls your wanted sub with the desired parameters.

+0

Gracias, Estoy al tanto de esta opción, pero quiero saber si hay algún truco para pasar el parámetro (no usando global). – jojo

4

Puede crear cualquier tipo de referencia de código que desee. No tiene que usar una referencia a una subrutina con nombre. Para obtener muchos ejemplos de cómo hacer esto, consulte mi módulo File::Find::Closures. Creé ese módulo para responder precisamente a esta pregunta.

+0

Esto puede funcionar para mí – jojo

Cuestiones relacionadas