Problem with subroutine Variable "$file" will not stay shared at..

P

pod69

Hello
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?

thank you
 
J

John W. Krahn

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
 
P

pod69

oh thank u very much for your hint i solved it now like that
my $file;
use File::Find;
find {wanted => sub {$file = $_ if /$filename/ }, no_chdir => 1},
$ENV{INCA_DIST};
return $file;

and with return $file it works;

thx
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top