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

Discussion in 'Perl Misc' started by pod69@gmx.net, Dec 30, 2006.

  1. Guest

    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
     
    , Dec 30, 2006
    #1
    1. Advertising

  2. Re: Problem with subroutine Variable "$file" will not stay sharedat..

    wrote:
    >
    > 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
    --
    Perl isn't a toolbox, but a small machine shop where you can special-order
    certain sorts of tools at low cost and in short order. -- Larry Wall
     
    John W. Krahn, Dec 30, 2006
    #2
    1. Advertising

  3. Guest

    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
     
    , Dec 30, 2006
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Andrew
    Replies:
    1
    Views:
    179
    Brian McCauley
    Jul 13, 2005
  2. king
    Replies:
    5
    Views:
    210
  3. cartercc

    variables that won't stay shared

    cartercc, Mar 2, 2009, in forum: Perl Misc
    Replies:
    3
    Views:
    179
    ccc31807
    Mar 3, 2009
  4. ccc31807
    Replies:
    8
    Views:
    503
    ccc31807
    Oct 6, 2009
  5. gb345
    Replies:
    3
    Views:
    232
    Eric Pozharski
    Oct 6, 2009
Loading...

Share This Page