"Shishir K. Singh" wrote:

> Try using it like this
>
> -----------------------------

Hi Shishir,

There is just one problem here, as demonstrated below, with the addition of a 
"brick-tosser" function.

use strict;

my $cache = {};

 &test("hello0",$cache);         #  Note:  better written as test("hello0",$cache);
 &test("hello1",$cache);         #     ampersand adds nothing
 &test("hello0",$cache);
 screw_things_up();
 &test("hello3",$cache);

 sub test {
     my $param = shift;
     my $cache = shift;

     my $cache_key = "param=$param";
     if (exists $cache->{$cache_key}) {
         print "Exists\n";
         return $cache->{$cache_key};
     }
     sleep 1;
     $cache->{$cache_key} = $param . "done"; # save the value
     print "does not exists\n";
 }

 sub screw_things_up {
      $cache->{'param=hello3'} = "param=hello3" .
 }

The reality is that anything declared in the global namespace, i.e. outside of a 
block, is vulnerable to external corruption.Even use-ing strict, the screw_things_up 
function can silently move in and corrupt you data.  I would suggest going with the 
closure, or better yet, declaring important variables inside a function definition:  
This has the added benefit of providing a name to describe the major functionaility of 
the overall program.

use strict;

test_cache {
 &test("hello0",$cache);         #  Note:  better written as test("hello0",$cache);
 &test("hello1",$cache);         #     ampersand adds nothing
 &test("hello0",$cache);
 screw_things_up();
 &test("hello3",$cache);
}

This will raise an error when $cache is addressed inside screw_things_up.  No function 
declared in the main package can access $cache unless it the reference specifically 
presented to it as an argument.  The only way to get at $cache then is through the 
front door.

Joseph


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to