my vs our vs local
by:
2 minutes
276 Words
2014-03-16 20:00 -0400
The short version for the impatient
my()creates a local variableour()creates a package variablelocal()temporarily changes the local value of a global variable- The above is mostly true.
The long version for the irrepressibly quixotic
my()
my declares the listed variable to be local to the enclosing block, file,
or eval. That is to say its scope is local. This kind of variable is
known as a lexical variable. Note that lexical variables are hidden from
subroutines which are called from within the enclosing block. This is known as
lexical scoping.
our()
our creates an alias to a package variable. The alias is local to the
enclosing block, file, or eval. That is to say the alias is lexically scoped
just like any lexical variable. However a package variable belongs to a
package. It can be accessed from anywhere if you use its fully qualified name.
Here are two examples of fully qualified package variables:
$main::a
%MyPackage::boop
Note that package variables are also global variables.
local()
local gives temporary values to global variables. It does not create a local
variable. It is most commonly used when you want to locally modify a global
variable such as one of the punctuation variables. For example:
{
local $| = 1; # enable autoflush for STDOUT
say "hi mom";
}
local modifies the listed variable to be local to the enclosing block,
file, or eval – AND to any subroutine called from within that block. This
is known as dynamic scoping.
Sources
For a more complete understanding I recommend perldoc perlfunc and especially
perldoc perlsub. Also the following links may be helpful: