Private Variables in Subroutines
But if Perl can give us a new @_ for every invocation, can’t it give us
variables for our own use as well? Of course it can.
By default, all variables in Perl are global variables; that is, they are
accessible from every part of the program. But you can create private
variables called lexical variables at any
time with the my operator:
sub max {
my($m, $n); # new, private variables for this block
($m, $n) = @_; # give names to the parameters
if ($m > $n) { $m } else { $n }
}These variables are private (or scoped) to
the enclosing block; any other $m or
$n is totally unaffected by these
two. And that goes the other way, too—no other code can access or modify
these private variables, by accident or design.[*] So, you could drop this subroutine into any Perl program
in the world and know that you wouldn’t mess up that program’s $m and $n
(if any).[†] It’s also worth pointing out that, inside the if’s blocks, there’s no semicolon needed after the return value expression.
Although Perl allows you to omit the last semicolon in a block, in
practice you omit it only when the code is so simple that you can write
the block in a single line.
The subroutine in the previous example could be made even simpler.
Did you notice that the list ($m, $n)
was written twice? That my operator
can also be applied to a list of variables enclosed in parentheses, so
it’s customary to combine those first two statements in the
subroutine:
my($m, $n) = @_; # Name the subroutine parameters ...