Приглашаем посетить
Хлебников (hlebnikov.lit-info.ru)

Section 4.5.  Private Variables in Subroutines

Previous
Table of Contents
Next

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).[Section 4.5.  Private Variables in Subroutines] Inside the if's blocks, there's 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.

[Section 4.5.  Private Variables in Subroutines] Of course, if that program had a subroutine called &max, you'd 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.

    Previous
    Table of Contents
    Next