my $array_ref = [];
for(1 .. 2) {
my $hash_ref = { foo => foo, bar => bar };
push(@{$array_ref}, $hash_ref);
}
my $hash_ref = $array_ref->[0];
$array_ref = [];
You'll be left with the hash ref, the referenced hash, it's keys and values.
Here's what happens, illustrated!
Initial State:
$array_ref $hash_ref
+--------------+ +--------------+
| array ref | | hash ref |
+--------------+ +--------------+
| refcount = 1 | | refcount = 1 |
+--------------+ +--------------------+ +--------------+
| o=====> | array | | o |
+--------------+ +--------------------+ +---------- : -+
| refcount = 1 | :
+--------------------+ :
| element 0 | :
| +--------------+ | :
| | hash ref | | :
| +--------------+ | :
| | refcount = 1 | | V
| +--------------+ | +--------------+
| | o========> | hash |
| +--------------+ | +--------------+
+--------------------+ | refcount = 2 |
| element 1 | +--------------+
| +--------------+ | | keys & vals |
| | hash ref | | +--------------+
| +--------------+ |
| | refcount = 1 | |
| +--------------+ | +--------------+
| | o========> | hash |
| +--------------+ | +--------------+
+--------------------+ | refcount = 1 |
+--------------+
| keys & vals |
+--------------+
#####
After the array reference is overwritten:
+--------------+ +--------------+
| array ref | | hash ref |
+--------------+ +--------------+
| refcount = 1 | | refcount = 1 |
+--------------+ +--------------------+ +--------------+
| o | | array | | o |
+---------- : -+ +--------------------+ +---------- : -+
: | refcount = 0 | :
: +--------------------+ :
V | element 0 | :
+--------------+ | +--------------+ | :
| array | | | hash ref | | :
+--------------+ | +--------------+ | :
| refcount = 1 | | | refcount = 1 | | V
+--------------+ | +--------------+ | +--------------+
| no elements | | | o========> | hash |
+--------------+ | +--------------+ | +--------------+
+--------------------+ | refcount = 2 |
| element 1 | +--------------+
| +--------------+ | | keys & vals |
| | hash ref | | +--------------+
| +--------------+ |
| | refcount = 1 | |
| +--------------+ | +--------------+
| | o========> | hash |
| +--------------+ | +--------------+
+--------------------+ | refcount = 1 |
+--------------+
| keys & vals |
+--------------+
#####
Automatically, the original array is freed since its refcount == 0.
+--------------+ +--------------+
| array ref | | hash ref |
+--------------+ +--------------+
| refcount = 1 | | refcount = 1 |
+--------------+ +--------------+
| o | | o |
+---------- : -+ +---------- : -+
: :
: :
V :
+--------------+ +--------------+ :
| array | | hash ref | :
+--------------+ +--------------+ :
| refcount = 1 | | refcount = 0 | V
+--------------+ +--------------+ +--------------+
| no elements | | o========> | hash |
+--------------+ +--------------+ +--------------+
| refcount = 2 |
+--------------+
+--------------+ | keys & vals |
| hash ref | +--------------+
+--------------+
| refcount = 0 |
+--------------+ +--------------+
| o========> | hash |
+--------------+ +--------------+
| refcount = 1 |
+--------------+
| keys & vals |
+--------------+
#####
Automatically, the hash refs with refcount == 0 are freed.
+--------------+ +--------------+
| array ref | | hash ref |
+--------------+ +--------------+
| refcount = 1 | | refcount = 1 |
+--------------+ +--------------+
| o | | o |
+---------- : -+ +---------- : -+
: :
: :
V :
+--------------+ :
| array | :
+--------------+ :
| refcount = 1 | V
+--------------+ +--------------+
| no elements | | hash |
+--------------+ +--------------+
| refcount = 1 |
+--------------+
| keys & vals |
+--------------+
+--------------+
| hash |
+--------------+
| refcount = 0 |
+--------------+
| keys & vals |
+--------------+
#####
Automatically, the hash with refcount == 0 is freed.
+--------------+ +--------------+
| array ref | | hash ref |
+--------------+ +--------------+
| refcount = 1 | | refcount = 1 |
+--------------+ +--------------+
| o | | o |
+---------- : -+ +---------- : -+
: :
: :
V :
+--------------+ :
| array | :
+--------------+ :
| refcount = 1 | V
+--------------+ +--------------+
| no elements | | hash |
+--------------+ +--------------+
| refcount = 1 |
+--------------+
| keys & vals |
+--------------+
|