How can I pass a parameter to the wanted function when using Perl's File::Find? [duplicate]
Question
Possible Duplicate:
How do I pass parameters to the File::Find subroutine that processes each file?
One can use Perl's File::Find module like this:
find( \&wanted, @directories);
How can we add a parameter to the wanted
function?
For example, I want to traverse the files in /tmp
extracting some information from each file and the result should be stored to a different directory. The output dir should be given as a parameter.
Solution
You use a closure:
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': $!";
}
OTHER TIPS
You can create any sort of code reference you like. You don't have to use a reference to a named subroutine. For many examples of how to do this, see my File::Find::Closures module. I created that module to answer precisely this question.
File::Find's contract specifies what information is passed to &wanted
.
The wanted function takes no arguments but rather does its work through a collection of variables.
$File::Find::dir
is the current directory name,$_
is the current filename within that directory$File::Find::name
is the complete pathname to the file.
If there is extra information you want to make available in the callback, you can create a sub reference that calls your wanted sub with the desired parameters.