in reply to Our, use vars, and magic, oh my!
There are basically two kinds of variables in Perl.
- Package variables live in the symbol table, and are accessible from anywhere in the program. (In some cases the access requires using a package qualifier.)
- Lexical variables do not live in the symbol table, and are accessible only from within the lexical scope where they are declared.
- use vars qw/ $var /; declares $var as a variable in the current package. Within that package, you can write $var to get that variable. From anywhere, you can write $Pkg::var.
- my $var; declares $var as a variable in the current lexical scope. Within that scope, you can write $var to get that variable. That's the only way you can access it, and the only place in the code you can access it.
- our $var; declares $var as a variable in the current package, and sets up $var as an alias to that variable within the current lexical scope. Within that scope, you can write $var to get that variable. From anywhere, you can write $Pkg::var.
Here's an example with use vars. Note that, although the use vars is within a block, it takes effect for the whole file. However, after the switch to package main, $var refers to $main::var.
#!perl -l package Pkg; { use vars qw/ $var /; $var = 7; print $var; # 7 } print $var; # 7 package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # 7
Here's an example with my. Note that only within the lexical block can you access the $var that holds the number 7.
#!perl -l package Pkg; { my $var = 7; print $var; # 7 } print $var; # undef; $Pkg::var has not been set # error with strict package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # undef; $Pkg::var has not been set
Here's an example with our. Note the behavior outside the block before the switch to main; $var refers to the $Pkg::var package variable, but without the package qualifier it would be an error with use strict.
#!perl -l package Pkg; { our $var = 7; print $var; # 7 } print $var; # 7 # error with strict package main; print $var; # undef; $main::var has not been set # error with strict print $Pkg::var; # 7
Here's another example with our. Note that, after the switch to package main, $var still refers to $Pkg::var, because we're still in the same lexical scope.
So, both use vars and our declare a variable in the current package. The difference between them is in how you can access the variable. With either one, you can always use $Pkg::var from anywhere. With use vars, you can use $var anywhere in the file, as long as you're in the right package. With our and use strict, you can only use $var within the lexical scope, but you can still use $var after switching packages.#!perl -l package Pkg; our $var = 7; print $var; # 7 package main; print $var; # 7; even though we switched packages, # $var still refers to $Pkg::var # in this lexical scope print $Pkg::var; # 7
Finally, to answer your question about which of three declarations to use at the top of a script. If you're only accessing the variables from that file, you can use my. If you don't switch to a different package later on in the file, use vars and our are equivalent. If you do switch packages, our could result in surprising behavior, as in the last example above.
Update: echo pointed out a few places where I had written $variable instead of $var.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Re: Our, use vars, and magic, oh my!
by OzzyOsbourne (Chaplain) on Aug 23, 2001 at 22:10 UTC | |
by danger (Priest) on Aug 24, 2001 at 02:25 UTC | |
by chipmunk (Parson) on Aug 23, 2001 at 23:16 UTC |
In Section
Seekers of Perl Wisdom