SPUG: Confusing behaivior with exported variables
Joshua ben Jore
twists at gmail.com
Tue Mar 24 12:57:40 PDT 2009
On Tue, Mar 24, 2009 at 12:25 PM, Mark Mertel <mark.mertel at yahoo.com> wrote:
> Using 'our' is only global within the package and its descendents. For the
> external scripts it would not be visible, hence, not global.
No, you're wrong.
my $Foo = 'bar';
our $Foo = 42;
print "$Foo\n"; # prints bar
print "$main::Foo\n"; # prints 42
our() declares a global. All globals are visible to all other code
though often other code must go to the effort of giving a fully
qualified name. Other code can avoid going to that trouble if it was
our() also has some additional magic in the parser but that doesn't
change that it's just a global.
my() is never a global. Other code that has an idea about where a
lexical lives can never access it. Rules-breaking code which inspects
perl internals can do it anyway but as stated - that is normally
against the rules.
If you put everything into a single file, or use do() or eval(), that
makes this more complicated but the above is still true.
More information about the spug-list