The problem is that you cannot (yet) share a nested references using threads::shared.
What you are sharing is not a hash but a scalar $HSH2. You are then
- auto-vivifying an anonymous hash,
- assigning a reference to that hash to $HSH2
- auto-vivifying another anonymous hash
- assigning the ref of that to an element of the first anon. hash.
- Assigning your string to an element in the second anon. hash.
Too many words, but your 2 lines of code
our $HSH2 : shared = ();
$HSH2{123}{456} = "foo.xml"; # fails
Is equivalent to
# Why initialise a scalar to an empty list?
our $HSH2 :shared = ();
# Assign a ref to an anonymous hash
$HSH2 = {};
# Assign a ref to another anon. hash to a new element of the first.
$HSH2->{123} = {};
# Assign a string to an element of the second.
$HSH2->{123}->{456} = 'foo.xml';
threads::shared only allows you to share a single level of shared structure, and this is three levels deep, hence the "Invalid value" .
Not a very good error message. It ought really read something like:
Assigning a reference to an element of a shared hash or array is not allowed.
I'm also not certain that sharing an our'd variable is a "good thing", as it is a lexified global. May be fine, but I've never tried it and it gives me an uneasy feeling.
Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller
|