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 mailing list