====== Reference ====== Reference were quite complex, so we made a resume from all info we found and try the make something clear and short. But they are extremly powerfull and is a must have if you do programming in perl. Of course we probably miss something so feel free to tell us what you think. === Rule#1 : Add "\" before your variable and get the ref === $array_ref = \@array; # $aref is a reference to @array $hash_ref = \%hash; # $href is a reference to %hash $scalar_ref = \$scalar; # $sref is a reference to $scalar $xy = $array_ref; # $xy is a copy of a reference to @array => it is a reference to @array $array[2] = $hash_ref; # $array[3] is a copy of a reference to %hash => it is a reference to %hash $scalar = $array[2] # $scalar is a copy of a copy of a reference to %hash => it is a reference to %hash $array_ref = [ 1, "foo", undef, 13 ]; # $array_ref is a reference to the array (1, "foo", undef, 13) $hash_ref = { APR => 4, AUG => 8 }; # $hash_ref is a reference to the hash (APR => 4, AUG => 8) or (APR, 4, AUG, 8) Note: the bracket are the same as the one that are used to access an element! @array = (1, 2, 3); $array_ref = \@array; can be written $array_ref = [ 1, 2, 3 ]; $hash = (APR, 4, AUG, 8); $hash_ref = \%hash; can be written $hash_ref = { APR => 4, AUG => 8 } In the second (short) form, we do not have an array variable or a hash variable explicitly: we call the "anonymous array" and "anonymous hash" === Rule#2: Code with non-ref variable "var" and replace them (dont remove the $@%) with your ref variable "{$var_ref}" : you get your variable dereferenced and you can access the real value. === Reverse rule or dereferencing: (Alternative: Dereferencing with arrow: recommended) @a = @{$array_ref}; A copy of the array which is referenced (can be a bug structure so be carefull) %h = %{$hash_ref}; A copy of the hash which is referenced (can be a bug structure so be carefull) $s = ${$scalar_ref}; A copy of the scalar which is referenced (not that big...) and now for the elements of array or hash: with:$arref = \@array; $href = \%hash; $scaref = \$scalar $array[3]=2; $ array [3]=2 is equivalent to ${$arref}[3]=2; ${$arref}[3]=2 $hash{3}=2; $ hash {3}=2 is equivalent to ${$href}{3}=2; ${$ href}{3}=2 @ array = @{$arref} = % hash = %{$ href} = $ scala = ${$scref} = {$ } This means we can code without ref and change your variable at the end var to {$var_ref} in any cases !!! Note2: a reference is also a scalar, but be carefull: with:$array_ref = \@array; $hash_ref = \%hash; $scalar_ref = \$scalar $a = ${$array_ref}; $a is an array in a "scalar context", so equivalent to "scalar @array" or $(@array) or $a = @array; $a is nb of element of the array! $h = ${$hash_ref}; $h is an hash in a "scalar context", so equivalent to "scalar $hash " or $(%hash ) or $h = %hash; $h a storage size of the hash (avoid) $s = ${$scalar_ref}; $s is a copy of the $scalar, so equivalent to "$s = $scalar... so ${\$scalar} is equivalent to $scalar! Note1: If we deref a ref we obtain the variable that can be of all type!: logic Note2: if we ref a deref we obtain the ref, logic! Note3: Why would you do that?... === Trivial case and simplification, even it works... === Trivial case and simplification, even it works... ${\$scalar} => $scalar @{\@array} => @array %{\%hash} => %array \${$scalar_ref} => $scalar_ref \@{$array_ref} => $array_ref \%{$hash_ref} => $array_ref So you shoud never have this: ${\$ safe to remove if the variable is a scalar @{\@ safe to remove if the variable is an array %{\% safe to remove if the variable is a hash \${$ safe to remove if the variable is a scalar ref \@{$ safe to remove if the variable is an array ref \%{$ safe to remove if the variable is a hash ref Note1: dont forget to remove the ending bracket! but what about that : \${$array_ref}[1] the referencing is apply a the end so 1. ${$array_ref}[1] we have an element of the array 2. \${$array_ref}[1] we have a scalar ref of the element of the array As you can see it is not safe to be removed as the variable is not a scalar....