in reply to "Variable will not stay shared" warning


Without seeing the surrounding code it is difficult to say. However, this section from perldiag might point you in the right direction:
Variable ``%s'' will not stay shared (W closure) An inner (nested) named subroutine is referencing a le +xical variable defined in an outer subroutine. When the inner subroutine is called, it will probably see the valu +e of the outer subroutine's variable as it was before and during the *f +irst* call to the outer subroutine; in this case, after the first call t +o 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 subrouti +nes 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.

--
John.

Replies are listed 'Best First'.
Re: Re: "Variable will not stay shared" warning
by George_Sherston (Vicar) on Aug 07, 2002 at 21:47 UTC
    Yeha. That was just what I needed. Now I get it. What was happening was that, for some reason that now eludes me, I had written one subroutine inside another. %Params got made in the outer sub. Like a good boy, I was passing arguments from the outer to the inner, even though the inner was within the scope of the outer. BUT, although I passed \%Params so that in the inner sub I did my $Params = shift; I was getting values out of it by $Params{MyKey}. If I'd put the inner sub outside the outer sub, I would have got an error, because %Params wd have been undefined; but in fact, it just assumed I was being lazy and not passing the argument. But still gave me a warning to help me see the error of my ways. Now when I do $Params->{MyKey} the error goes away. A spoonful of sugar helps the medicine go down, as they say. Thanks.

    § George Sherston