"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]