[Melbourne-pm] quirky behaviour of 'local'...

Mathew Robertson mathew.blair.robertson at gmail.com
Tue Jul 26 00:00:54 PDT 2011


On 26 July 2011 16:27, Toby Corkindale <toby.corkindale at strategicdata.com.au
> wrote:

> On 26/07/11 16:07, Mathew Robertson wrote:
>
>> Hi all,
>>
>> As a result of some hacking on some code, I identified some quirky
>> behaviour with regards to 'local'...   I have whittled the problem down
>> to it simplest form - see below.
>>
>> Basically speaking, I would have expected the inner-array-variable to
>> become localised to block scope.  Is there something that I am missing
>> here?
>>
>
> What is happening here is a quirk of how Perl does multi-level data
> structures..
>
> $HANDLERS{c} contains a reference to an array.
> When you localise $HANDLERS{c} you are localising the value of that
> reference.. not the actual data in the referenced thing.
>

Indeed that looks to be the case... which is why in the posted example, I
also attempted to the use the localised dereferenced array (commented out),
but to no avail as I am probably localising the array ref.


> You can achieve the result you're looking for with this mess:
>
> use Storable qw(dclone);
> {
>  # local $HANDLERS{c} = $HANDLERS{c};
>  local $HANDLERS{c} = dclone($HANDLERS{c});
>
>  push @{$HANDLERS{c}}, 'u';
>  print Dumper(\%HANDLERS);
> }
>

Not directly related the original question, but somewhat relevant I
guess.... How does Storable::dclone compare to Clone::clone ?

regards,
Mathew
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/melbourne-pm/attachments/20110726/916072a6/attachment.html>


More information about the Melbourne-pm mailing list