davido has asked for the wisdom of the Perl Monks concerning the following question:

I understand that if I want a function to have access to a static variable, without that variable cluttering global namespace, I can do the following:

{ my $static = "Persistant"; sub mytest { return $static; } } print mytest(), "\n";

This works because even though $static has fallen out of scope in the outtermost block (the file, in this case), it is still in scope whenever the subroutine is called, because the sub was declared (and defined, in this case) where the scope is still active. Essentially, though the program's execution continues past the close of $static's scope, it never gets reaped because its block is still relevant to the globally declared sub, 'mytest'.

But what if I want the function definition, and whatever clutter it took to derive the value stored in $static, to appear at the bottom of the script, somewhere after my use of mytest() in print mytest(), "\n";?

If, for reasons of asthetic style, I prefer to have the main execution block at the top, and subroutine definitions at the bottom (which works fine unless I'm trying to maintain a static, non-global variable for a sub), is there no way to satisfy both my sense of asthetics, and function at the same time by allowing the definition of functions that use static variables, and their surrounding blocks which give scope to their static variables, to appear later on?

Dave

"If I had my life to do over again, I'd be a plumber." -- Albert Einstein

Replies are listed 'Best First'.
Re: Static function variables without top declaration?
by bart (Canon) on Sep 27, 2003 at 00:38 UTC
    Eh, what? You want to put all of this code at the end of the script? Sure, why not? If you're worried about a lack of initialisation for this static variable until it's far too late, you can wrap the initialisation in a BEGIN block:
    print mytest(), "\n"; { my $static; BEGIN { $static = "Persistant"; } sub mytest { return $static; } }
Re: Static function variables without top declaration?
by Limbic~Region (Chancellor) on Sep 26, 2003 at 23:26 UTC
    davido,
    OWTDI is to change to a re-useable closure:
    #!/usr/bin/perl -w use strict; my $static = mytest(); print $static->(); # Lot more code sub mytest { my $static = "Persistent"; return sub { $static }; }
    Cheers - L~R
Re: Static function variables without top declaration?
by Fletch (Bishop) on Sep 26, 2003 at 23:37 UTC

    I'm working on something now moving gobs of file scoped lexicals into an AppConfig instance. You could put all of your global state into a singleton AppConfig instance and use that instead of multiple variables.

    package MyConfig; use constant CONFIG_PATH => q(/usr/share/myconf.cfg); my $_cfg = undef; sub fetch { $_cfg ||= AppConfig->new( )->file( CONFIG_PATH ); return $_cfg; } package main; fooble(); sub fooble { my $cfg = MyConfig->fetch; print "fooble is", $cfg->fooble(), "\n"; }
Re: Static function variables without top declaration?
by tilly (Archbishop) on Sep 28, 2003 at 01:15 UTC
    Tie::Static will work if you are not overly concerned with performance. (Tied anything is a significant performance hit.)