I find that the following 4 simple rules cover all of the ways to dereference data structure references. Having the rules spelled out so simply has made using references much less confusing to me.
-
To use a reference, say $ref, you put {$ref}
in place of a variable name ( not counting the $, %, or @ ). That is, replace the variable name with the reference enclosed in braces:
Note that this works for any expression that returns a reference, not just the simple examples above:$scalar ${$sRef} @array @{$aRef} $array[0] ${$aRef}[0] $#array $#{$aRef} %hash %{$hRef} $hash{KEY} ${$hRef}{KEY} @hash{@list} @{$hRef}{@list}${$sRefs[0]} ${$sRefs{key}} ${getScalarRef()} @{$aRefs[0]} @{$aRefs{key}} @{getArrayRef()} %{$hRefs[0]} %{$hRefs{key}} %{getHashRef()} @{ $bool ? \%hash1 : \%hash2 }{qw(some keys)} -
If the reference is held in a simple scalar variable, then
the braces, { and }, can be dropped:
$scalar $$sRef @array @$aRef $array[0] $$aRef[0] $#array $#$aRef %hash %$hRef $hash{KEY} $$hRef{KEY} @hash{@list} @$hRef{@list}
-
If you are getting a scalar from a hash or an array, then you can replace ${$ref} with $ref->:
$array[0] ${$aRef}[0] $aRef->[0] $hash{KEY} ${$hRef}{KEY} $hRef->{KEY}
-
If the reference is in a hash or an array (and you are getting back a scalar), then you can drop the -> between the adjacent [0] and/or {KEY} parts:
${$aRef->[0]}[1] $aRef->[0]->[1] $aRef->[0][1] ${$aRef->[0]}{KEY} $aRef->[0]->{KEY} $aRef->[0]{KEY} ${$hRef->{KEY}}[1] $hRef->{KEY}->[1] $hRef->{KEY}[1] ${$hRef->{A}}{B} $hRef->{A}->{B} $hRef->{A}{B}
I hope others find this as helpful as I have.
Thanks to arturo for suggesting that I turn references quick reference (Re: push) into a tutorial.
- tye (but my friends call me "Tye")Thanks to kutsu for pointing out that I've had ${hRef}{KEY} instead of ${$hRef}{KEY} for all these years.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re (tilly) 1: References quick reference
by tilly (Archbishop) on Apr 05, 2001 at 08:46 UTC | |
by tye (Sage) on Apr 05, 2001 at 09:49 UTC | |
by demerphq (Chancellor) on Jun 28, 2003 at 09:25 UTC | |
Re: References quick reference
by lachoy (Parson) on Apr 05, 2001 at 03:46 UTC | |
by tye (Sage) on Apr 05, 2001 at 21:44 UTC | |
by gobisankar (Acolyte) on Apr 30, 2010 at 07:03 UTC | |
Re: References quick reference
by Anonymous Monk on Nov 04, 2005 at 09:22 UTC | |
Re: References quick reference
by ixolit (Novice) on Feb 08, 2008 at 18:27 UTC | |
Re: References quick reference
by fedekiller (Initiate) on Dec 12, 2006 at 22:20 UTC | |
by buchi2 (Acolyte) on Aug 11, 2017 at 09:47 UTC | |
by Athanasius (Archbishop) on Aug 11, 2017 at 13:08 UTC | |
by stevieb (Canon) on Aug 11, 2017 at 23:45 UTC |
Back to
Tutorials