Scoping via Anonymous Blocks
And there is.
The solution is to stick
something called an anonymous block
around the
subroutine (which just means a pair of curly braces with no
associated subroutine name), with the my %date_seconds
declaration inside that block but outside the
subroutine proper. That is, something like:
{ # start of anonymous block my %date_seconds; sub get_seconds { # subroutine definition goes here } } # end of anonymous block
This way, the same %date_seconds
hash is visible
to every invocation of the &get_seconds
subroutine, and thus is available for caching
timelocal
lookup results, but the hash
remains invisible for the rest of the script.
Remember that %month_num
hash we initialized up at the top of
the script? Since the &get_seconds
subroutine
is the only thing in the script that uses it, it would be nice to
limit its scope, too, by putting it inside the anonymous block.
(Putting it inside the subroutine itself would work, but it would be
inefficient because the initialization of the hash would have to be
repeated each time the subroutine was invoked.)
There is a problem with putting the %month_num
initialization inside the anonymous block, though. You will recall
that Perl goes through two phases when it runs a script. The first
phase, called the compilation
phase
, is the time when things like
subroutine definitions are processed. After that comes the
runtime phase
, when the sequential commands in the script are actually executed. This is why we can successfully ...
Get Perl for Web Site Management now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.