David Baird am Dienstag, 15. November 2005 11.07:
> On 11/15/05, John Doe <[EMAIL PROTECTED]> wrote:
> > Jeremy Nixon am Dienstag, 15. November 2005 08.06:
> > > Peter1 Alvin  <[EMAIL PROTECTED]> wrote:
[...]
> > > { # start a lexical scope
> > > my %d_cache;
> > > sub handler {
> > >     # stuff
> > >     if (not defined($d_cache{$foo})) {
> > >         # pull in directory listing and store it in $d_cache{$foo}
> > >     }
> > >     # proceed to use $d_cache{$foo} information
> > > }
> > > } end lexical scope
> > >
> > > This way, a directory is only actually read once (at most) per server
> > > child process.
> >
> > Hi Jeremy
> >
> > Hope it's not a stupid question, but are you sure %d_cache survives a
> > request? Maybe I'm totally misunderstanding something but I thought after
> > the point
> >
> > } end lexical scope
> >
> > %d_cache gets destroyed (if not still referenced from somewhere else).
> >
> > I would have left out the scope-{} to keep %d_cache at file level.
> > Would that be wrong? And why?
>
> The handler() sub stays in scope - it's basically a global variable,
> and it holds a reference to %d_cache. So %d_cache goes out of scope,
> but doesn't get destroyed. It hangs around until the next time
> handler() is called, at which point you're back in the same scope and
> can access %d_cache again.

Hi David

thanks a lot for your answer! I have still a last question to get it 100%:

The (lexical scoped) code as shown above does _not_ show the required 
referencing of %d_cache, right? Something like 

   if (not defined($d_cache{$foo}))

is not sufficient, right?

Whereas something like

   $keep_ref=\%d_cache;

in the handler() would, right?

(If I'm not right, I didn't get something basic right, although I read a lot 
of documentation about this issue... I would have to review/change a lot of 
code I've written)

Thanks a lot in advance

Reply via email to