The following code will work as you expected:
package Foo; our $d; #the only line added sub top { my($fn) = @_; our($d) = ["a", "b"]; printf "Top before %s [%s]\n", $d, join(",", @$d); $fn->($d); printf "Top After %s [%s]\n", $d, join(",", @$d); } package Bar; Foo::top(sub { #our($d) = @_; #removed! printf " Before %s [%s]\n", $d, join(",", @$d); $d = []; printf " After %s [%s]\n", $d, join(",", @$d); });
The lexical scope is bordered by the innermost curly brackets or the boundaries of the file :) You must declare your variable in the lexical scope which includes all scopes where you want to see this variable. This is why i added the line our $d;
If you define the variable $d with our in the different packege, it is supposed to be a DIFFERENT $d variable. This is why i commented out the line in the second package.
See our() manpage for more details.UPD: added execution result:
Top before ARRAY(0x1a60b7c) [a,b] Before ARRAY(0x1a60b7c) [a,b] After ARRAY(0x1a60bb8) [] Top After ARRAY(0x1a60bb8) []
In reply to Re: 'Our' limits?
by Ieronim
in thread 'Our' limits?
by cedar
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |