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