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:
$scalar ${$sRef}
@array @{$aRef}
$array[0] ${$aRef}[0]
$#array $#{$aRef}
%hash %{$hRef}
$hash{KEY} ${$hRef}{KEY}
@hash{@list} @{$hRef}{@list}
Note that this works for any expression that returns a reference, not just the simple examples above:
${$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.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.
|
|