One technique for 'static' variables in Perl (that you should be able
to adapt to your underlying problem) is to wrap the sub in a
bare block (or possibly a BEGIN block depending on initialization
requirements and such). Your pseudo-code example becomes:
#!/usr/bin/perl -w
use strict;
foo(4);
foo();
{
my $bar;
sub foo {
$bar = shift unless defined $bar;
print "$bar\n";
}
}
__END__
Which, in the case of an expensive initialization can be along the
lines of:
#!/usr/bin/perl -w
use strict;
print scalar localtime(),"\n";
slow_once(5);
slow_once();
{
my $expensive_thingy;
sub slow_once {
unless (defined $expensive_thingy) {
# make expensive thingy:
sleep 5;
$expensive_thingy = shift;
}
print scalar localtime()," :$expensive_thingy:\n";
}
}
__END__
OUTPUT:
Sat Nov 3 15:55:31 2001
Sat Nov 3 15:55:36 2001 :5:
Sat Nov 3 15:55:36 2001 :5:
If you wanted to create more than one expensive thingy, go with a
parameterized sub that sets up the expensive thingy and returns a
closure that does what you want with it.