From: Gunnar Hjalmarsson <[EMAIL PROTECTED]>
> Ron Goral wrote:
> > I am having some difficulty with a module that is using File::Find.
> > The method is below.
> >
> > The idea is to enter this method feeding it a file name and
> > beginning directory and then looking for all occasions of
> > $file_name and push those addresses into @a_files. This works fine
> > until I need to use FindPath again during the same session. What
> > I'm finding is that while @a_files looses scope within FindPath
> > itself, it does not in ProcessFile. In other words, when I exit
> > FindPath and come back into it later, @a_files is an uninitiated
> > array. However when ProcessFile is called, @a_files has retained
> > the values it had from the last call to FindPath.
> >
> > Am I making sense?
>
> Yes. But you are apparently running the code without warnings enabled,
> or else Perl would have indicated the reason for this problem.
>
> > sub FindPath
> > {
> > #- Var Declaration And Initialization
> > my ($hr_self, $file_name, $file_path) = @_;
> > # Array to fill with file paths
> > my @a_files = ();
> >
> > # Search file_path for the file
> > find(\&ProcessFile, $file_path);
> >
> > #- The Subroutine To Process Files And Directories
> > sub ProcessFile
> > {if ($_ eq $file_name){push (@a_files, $File::Find::name);}}
> >
> > # Return the paths found
> > return @a_files;
> > } # end FindPath
>
> One possible solution is to move the ProcessFile() function out from
> FindPath(), so the former is no longer a nested sub:
>
> sub ProcessFile {
> my ($a_files, $file_name) = @_;
> push @$a_files, $File::Find::name if $_ eq $file_name;
> }
>
> and call ProcessFile() from FindPath() with arguments:
>
> find( \&ProcessFile( [EMAIL PROTECTED], $file_name ), $file_path );
You can't do that. You'd have to write it like this:
find( sub {ProcessFile( [EMAIL PROTECTED], $file_name )}, $file_path );
Another option would be to use an unnamed subroutine like this:
sub FindPath
{
#- Var Declaration And Initialization
my ($hr_self, $file_name, $file_path) = @_;
# Array to fill with file paths
my @a_files = ();
# Search file_path for the file
find(sub {
if ($_ eq $file_name){push (@a_files, $File::Find::name);}
}, $file_path);
# Return the paths found
return @a_files;
} # end FindPath
Or (which might very well be fastest) you'd declare the $file_name
and @a_files outside the FindPath and ProcessFile:
{
my ($file_name, @a_files);
sub FindPath
{
#- Var Declaration And Initialization
my ($hr_self, $file_path);
($hr_self, $file_name, $file_path) = @_;
# Array to fill with file paths
@a_files = ();
# Search file_path for the file
find(\&ProcessFile, $file_path);
# Return the paths found
return @a_files;
} # end FindPath
#- The Subroutine To Process Files And Directories
sub ProcessFile {
if ($_ eq $file_name){push (@a_files, $File::Find::name);}
}
}
HTH, Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed
to get drunk and croon as much as they like.
-- Terry Pratchett in Sourcery
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>