Section 4.5. Private Variables in Subroutines


4.5. 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 accessable 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.[*] 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).[] Inside the if's blocks, theres no semicolon needed after the return value expression. Though 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.

[*] Advanced programmers will realize that a lexical variable may be accessible by reference from outside its scope but never by name.

[] Of course, if that program had a subroutine called &max, youd mess that up.

The subroutine in the previous example could be made simpler. Did you notice that the list ($m, $n) was written twice? The my operator can 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

That one statement creates the private variables and sets their values, so the first parameter has the easier name $m and the second has $n. Nearly every subroutine will start with a line much like that one, naming its parameters. When you see that line, you'll know that the subroutine expects two scalar parameters, which you'll call $m and $n inside the subroutine.



Learning Perl
Learning Perl, 5th Edition
ISBN: 0596520107
EAN: 2147483647
Year: 2003
Pages: 232

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net