"R. Joseph Newton" wrote:
> Sorry, the function I proposed [see bottom] did not properly enclose the
> declaration, and thus would not have provided the protection I referred to.. Should
> have been:
> test_cache();
> sub test_cache {
> my $cache = {};
>
> &test("hello0",$cache);
> &test("hello1",$cache);
> &test("hello0",$cache);
> screw_things_up();
> &test("hello3",$cache);
> }
> 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]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]