What is the difference between 'my' and 'our' in Perl?
How does our
differ from my
and what does our
do?
In Summary:
Available since Perl 5, my
is a way to declare non-package variables, that are:
- private
- new
- non-global
- separate from any package, so that the variable cannot be accessed in the form of
$package_name::variable
.
On the other hand, our
variables are package variables, and thus automatically:
- global variables
- definitely not private
- not necessarily new
- can be accessed outside the package (or lexical scope) with the
qualified namespace, as
$package_name::variable
.
Declaring a variable with our
allows you to predeclare variables in order to use them under use strict
without getting typo warnings or compile-time errors. Since Perl 5.6, it has replaced the obsolete use vars
, which was only file-scoped, and not lexically scoped as is our
.
For example, the formal, qualified name for variable $x
inside package main
is $main::x
. Declaring our $x
allows you to use the bare $x
variable without penalty (i.e., without a resulting error), in the scope of the declaration, when the script uses use strict
or use strict "vars"
. The scope might be one, or two, or more packages, or one small block.
The PerlMonks and PerlDoc links from cartman and Olafur are a great reference - below is my crack at a summary:
my
variables are lexically scoped within a single block defined by {}
or within the same file if not in {}
s. They are not accessible from packages/subroutines defined outside of the same lexical scope / block.
our
variables are scoped within a package/file and accessible from any code that use
or require
that package/file - name conflicts are resolved between packages by prepending the appropriate namespace.
Just to round it out, local
variables are "dynamically" scoped, differing from my
variables in that they are also accessible from subroutines called within the same block.