FAQ 7.16 How do I create a static variable?

Discussion in 'Perl Misc' started by PerlFAQ Server, Apr 14, 2011.

  1. This is an excerpt from the latest version perlfaq7.pod, which
    comes with the standard Perl distribution. These postings aim to
    reduce the number of repeated questions as well as allow the community
    to review and update the answers. The latest version of the complete
    perlfaq is at http://faq.perl.org .

    --------------------------------------------------------------------

    7.16: How do I create a static variable?

    (contributed by brian d foy)

    In Perl 5.10, declare the variable with "state". The "state" declaration
    creates the lexical variable that persists between calls to the
    subroutine:

    sub counter { state $count = 1; $counter++ }

    You can fake a static variable by using a lexical variable which goes
    out of scope. In this example, you define the subroutine "counter", and
    it uses the lexical variable $count. Since you wrap this in a BEGIN
    block, $count is defined at compile-time, but also goes out of scope at
    the end of the BEGIN block. The BEGIN block also ensures that the
    subroutine and the value it uses is defined at compile-time so the
    subroutine is ready to use just like any other subroutine, and you can
    put this code in the same place as other subroutines in the program text
    (i.e. at the end of the code, typically). The subroutine "counter" still
    has a reference to the data, and is the only way you can access the
    value (and each time you do, you increment the value). The data in chunk
    of memory defined by $count is private to "counter".

    BEGIN {
    my $count = 1;
    sub counter { $count++ }
    }

    my $start = counter();

    .... # code that calls counter();

    my $end = counter();

    In the previous example, you created a function-private variable because
    only one function remembered its reference. You could define multiple
    functions while the variable is in scope, and each function can share
    the "private" variable. It's not really "static" because you can access
    it outside the function while the lexical variable is in scope, and even
    create references to it. In this example, "increment_count" and
    "return_count" share the variable. One function adds to the value and
    the other simply returns the value. They can both access $count, and
    since it has gone out of scope, there is no other way to access it.

    BEGIN {
    my $count = 1;
    sub increment_count { $count++ }
    sub return_count { $count }
    }

    To declare a file-private variable, you still use a lexical variable. A
    file is also a scope, so a lexical variable defined in the file cannot
    be seen from any other file.

    See "Persistent Private Variables" in perlsub for more information. The
    discussion of closures in perlref may help you even though we did not
    use anonymous subroutines in this answer. See "Persistent Private
    Variables" in perlsub for details.



    --------------------------------------------------------------------

    The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
    are not necessarily experts in every domain where Perl might show up,
    so please include as much information as possible and relevant in any
    corrections. The perlfaq-workers also don't have access to every
    operating system or platform, so please include relevant details for
    corrections to examples that do not work on particular platforms.
    Working code is greatly appreciated.

    If you'd like to help maintain the perlfaq, see the details in
    perlfaq.pod.
    PerlFAQ Server, Apr 14, 2011
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. kookey
    Replies:
    3
    Views:
    20,757
    Andrew Thompson
    Aug 20, 2005
  2. Patrick Hoffmann
    Replies:
    3
    Views:
    2,830
    Christian Jan├čen
    Aug 8, 2003
  3. Marcin Vorbrodt

    Global static variable vs static method

    Marcin Vorbrodt, Sep 5, 2003, in forum: C++
    Replies:
    3
    Views:
    5,415
    Denis Perelyubskiy
    Sep 5, 2003
  4. Sam
    Replies:
    4
    Views:
    471
    The Directive
    Jan 13, 2004
  5. PerlFAQ Server

    FAQ 7.16 How do I create a static variable?

    PerlFAQ Server, Feb 14, 2011, in forum: Perl Misc
    Replies:
    0
    Views:
    173
    PerlFAQ Server
    Feb 14, 2011
Loading...

Share This Page