in reply to Variable will not stay shared in subroutine

From perldiag:
Variable "%s" will not stay shared</strong

(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.

2;0 juerd@ouranos:~$ perl -e'undef christmas' Segmentation fault 2;139 juerd@ouranos:~$

Replies are listed 'Best First'.
Re(2): Variable will not stay shared in subroutine
by dmmiller2k (Chaplain) on Jan 09, 2002 at 21:37 UTC

    Or, in even more other words, your variable $self will be frozen (in a closure) by the subroutine desc_by_date_asc_by_name() when sort_results() is called for the first time (in case you were wondering).

    Update: added parenthetical "closure" clarification.

    dmm

    You can give a man a fish and feed him for a day ...
    Or, you can
    teach him to fish and feed him for a lifetime