our
our
our VARLIST
our TYPE VARLIST
our VARLIST : ATTRS
our TYPE VARLIST : ATTRS
our
makes a lexical alias to a package (i-e- global) variable of the same name in the current package for use within the current lexical scope-
our
has the same scoping rules as my
or state
, meaning that it is only valid within a lexical scope. Unlike my
and state
, which both declare new (lexical) variables, our
only creates an alias to an existing variable: a package variable of the same name-
This means that when use strict 'vars'
is in effect, our
lets you use a package variable without qualifying it with the package name, but only within the lexical scope of the our
declaration- This applies immediately--even within the same statement-
package Foo; use strict; $Foo::foo = 23; { our $foo; # alias to $Foo::foo print $foo; # prints 23 } print $Foo::foo; # prints 23 print $foo; # ERROR: requires explicit package name
This works even if the package variable has not been used before, as package variables spring into existence when first used.
package Foo; use strict; our $foo = 23; # just like $Foo::foo = 23 print $Foo::foo; # prints 23
Because the variable becomes legal immediately under use strict 'vars'
, so long as there is no variable with that name is already in scope, you can then reference the package variable again even within the same statement.
package Foo; use strict; my $foo = $foo; # error, undeclared $foo on right-hand side our $foo = $foo; # no errors
If more than one variable is listed, the list must be placed in parentheses.
our($bar, $baz);
An our
declaration declares an alias for a package variable that will be visible across its entire lexical scope, even across package boundaries- The package in which the variable is entered is determined at the point of the declaration, not at the point of use- This means the following behavior holds:
package Foo; our $bar; # declares $Foo::bar for rest of lexical scope $bar = 20; package Bar; print $bar; # prints 20, as it refers to $Foo::bar
Multiple our
declarations with the same name in the same lexical scope are allowed if they are in different packages- If they happen to be in the same package, Perl will emit warnings if you have asked for them, just like multiple my
declarations- Unlike a second my
declaration, which will bind the name to a fresh variable, a second our
declaration in the same package, in the same scope, is merely redundant-
use warnings; package Foo; our $bar; # declares $Foo::bar for rest of lexical scope $bar = 20; package Bar; our $bar = 30; # declares $Bar::bar for rest of lexical scope print $bar; # prints 30 our $bar; # emits warning but has no other effect print $bar; # still prints 30
An our
declaration may also have a list of attributes associated with it-
The exact semantics and interface of TYPE and ATTRS are still evolving- TYPE is currently bound to the use of the fields
pragma, and attributes are handled using the attributes
pragma, or, starting from Perl 5.8.0, also via the Attribute::Handlers
module. See Private Variables via my() in perlsub for details, and fields, attributes, and Attribute::Handlers.
Note that with a parenthesised list, undef
can be used as a dummy placeholder, for example to skip assignment of initial values:
our ( undef, $min, $hour ) = localtime;
our
differs from use vars
, which allows use of an unqualified name only within the affected package, but across scopes.
© 1993–2016 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
http://perldoc.perl.org/5.20.2/functions/our.html