I use this function with the subroutine match to find a file:
sub search{
my $file = shift;
use File::Find;
find {wanted => \&match, no_chdir => 1}, "/home";
sub match {
return $_ if /$file/;
}
}
The problem I have is with the inner subroutine. I dont know how i can
get rid of the warning Variable "$file" will not stay shared at. I dont
want to change it i just want to compare it?
perldoc perldiag
[ snip ]
Variable "%s" will not stay shared
(W closure) An inner (nested) named subroutine is referencing a
lexical variable defined in an outer subroutine.
When the inner subroutine is called, it will probably see the value of
the outer subroutine's variable as it was before and during the
*first* call to the outer subroutine; in this case, after the first
call to the outer subroutine is complete, the inner and outer
subroutines will no longer share a common value for the variable. In
other words, the variable will no longer be shared.
Furthermore, if the outer subroutine is anonymous and references a
lexical variable outside itself, then the outer and inner subroutines
will never share the given variable.
This problem can usually be solved by making the inner subroutine
anonymous, using the "sub {}" syntax. When inner anonymous subs that
reference variables in outer subroutines are called or referenced,
they are automatically rebound to the current values of such
variables.
So you probably want to use an anonymous sub:
sub search {
my $file = shift;
use File::Find;
find {wanted => sub { return $_ if /$file/ }, no_chdir => 1}, "/home";
}
Although returning a value from the 'wanted' callback sub will not return it
from your 'search' sub so you may need to use a module other than File::Find.
John