my EXPR
This operator declares one or more private variables to exist only within the innermost enclosing block, subroutine, eval, or file. If more than one variable is listed, the list must be placed in parentheses, because the operator binds more tightly than comma. Only simple scalars or complete arrays and hashes may be declared this way. The variable name may not be package qualified, because package variables are all global, and private variables are not related to any package. Unlike local, this operator has nothing to do with global variables, other than hiding any other variable of the same name from view within its scope. (A global variable can always be accessed through its package-qualified form, however.) A private variable is not visible until the statement after its declaration. Subroutines called from within the scope of such a private variable cannot see the private variable unless the subroutine is also textually declared within the scope of the variable. The technical term for this is "lexical scoping", so we often call these "lexical variables". In C culture they're called "auto" variables, since they're automatically allocated and deallocated at scope entry and exit.
The EXPR
may be assigned to if desired, which allows you to initialize
your lexical variables. (If no initializer is given, all scalars are
initialized to the undefined value and all arrays and hashes
to empty arrays.) As with ordinary assignment, if you
use parentheses around the variables on the left (or if the variable is
an array or hash), the expression on
the right is evaluated in list context. Otherwise the expression
on the right is evaluated in scalar context. You can name your formal
subroutine parameters with a list assignment, like this:
my ($friends, $romans, $countrymen) = @_;
Be careful not to omit the parentheses indicating list assignment, like this:
my $country = @_; # right or wrong?
This assigns the length of the array (that is, the number of the subroutine's arguments) to the variable, since the array is being evaluated in scalar context. You can profitably use scalar assignment for a formal parameter though, as long as you use the shift operator. In fact, since object methods are passed the object as the first argument, many such method subroutines start off like this:
sub simple_as { my $self = shift; # scalar assignment my ($a,$b,$c) = @_; # list assignment ... }