Here's code to implement a function-private variable:
BEGIN {
my $counter = 42;
sub prev_counter { return --$counter }
sub next_counter { return $counter++ }
}
Now prev_counter and next_counter share a private
variable $counter that was initialized at compile time.
To declare a file-private variable, you'll still use a my,
putting it at the outer scope level at the top of the file. Assume this is
in file Pax.pm:
package Pax;
my $started = scalar(localtime(time()));
sub begun { return $started }
When use Pax or require Pax loads this module, the variable will be initialized. It won't get
garbage-collected the way most variables going out of scope do, because the
begun function cares about it, but no one else can get it. It
is not called $Pax::started because its scope is unrelated to the package.
It's scoped to the file. You could conceivably have several packages in
that same file all accessing the same private variable, but another file
with the same package couldn't get to it.