> "use vars" and "our" do roughly the same thing.  They both 
> let you use package variables under strict without fully-qualifying.
> 
> All these code snippets pass strict, and they each set the 
> package variable $foo ($A::foo, $B::foo, and $C::foo).
> 
>     use strict;
> 
>     {
>       package A;
>       use vars qw($foo);
>       $foo = 'A::foo';
>     }
> 
>     {
>       package B;
>       our $foo;
>       $foo = 'B::foo';
>     }
> 
>     {
>       package C;
>       $C::foo = 'C::foo';    # fully-qualifying
>     }
> 
> The main practical difference is, like you said, that "our" 
> is new in 5.6.  So if you want to support perl5.005_03 (which 
> is still in relatively wide use) you have to "use vars" instead.
> 
> But "use vars" and "our" work differently, and there are some 
> subtle differences in their behavior.
> 
> First of all, "use vars" does its magic by twiddling the 
> symbol table, marking the $foo variable as "imported".  Since 
> the symbol table is global, you can use $foo any time you are 
> in the package that imported it -- even if you're in a 
> different block or file.
> 
>     package A;
>     use strict;
> 
>     { use vars qw($foo) }
>     $foo = 'A::foo';       # different block; no problem
> 
> And for the same reason, a "use vars" declaration doesn't 
> extend across two packages in the same block or file.
> 
>     package A;
>     use strict;
> 
>     use vars qw($foo);
> 
>     package B;
>     $foo = 'B::foo';       # different package: ERROR
> 
> On the other hand, "our" does its magic by creating a lexical 
> symbol (like a "my" variable) that is aliased to the package 
> variable of the same name.  Since lexical symbols are only 
> visible in the scope (block, file, or eval) where they were 
> declared, the "our" declaration doesn't exist outside this block.
> 
>     package A;
>     use strict;
> 
>     { our $foo; }
>     $foo = 'A::foo';       # different lexical scope: ERROR
> 
> And when you have several packages in the same lexical scope, 
> the "our" declaration extends across them.
> 
>     package A;
>     use strict;
> 
>     our $foo;              # alias to $A::foo
> 
>     package B;
>     $foo = 'A::foo';       # STILL refers to $A::foo
> 
> -- 

Thanks Steve, 

Very imformative and helpful!

I'll read over hwta you and Rob said and let it soak in and go from there!

Thanks again,

Dan

> Steve
> 

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to