A my
declares the listed variables to be local (lexically) to the enclosing block, file, or eval
. If more than one variable is listed, the list must be placed in parentheses.
Note that with a parenthesised list, undef
can be used as a dummy placeholder, for example to skip assignment of initial values:
my ( undef, $min, $hour ) = localtime;
Like state
, local
, and our
, my
can operate on a variable anywhere it appears in an expression (aside from interpolation in strings). The declaration will not apply to additional uses of the same variable until the next statement. This means additional uses of that variable within the same statement will act as they would have before that declaration occurred, or result in a strict 'vars' error, as appropriate.
package main;
our $x = 2;
foo($x, my $x = $x + 1, $x); # foo() receives (2, 3, 2)
foo($x, $main::x); # foo() receives (3, 2)
Redeclaring a variable in the same scope or statement will "shadow" the previous declaration, creating a new instance and preventing access to the previous one. This is usually undesired and, if warnings are enabled, will result in a warning in the shadow
category.
The exact semantics and interface of TYPE and ATTRS are still evolving. TYPE may be a bareword, a constant declared with use constant
, or __PACKAGE__
. It 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.