Perl Dereferencing Syntax

Whenever you can use the name of a variable, you can use a block that evaluates to a reference instead. For example, the following are valid syntax for specifying an array:

@NAME    # If you have the name      e.g. @array
@BLOCK   # If you have a reference   e.g. @{ $ref }

This is the “circumfix syntax” illustrated in the table below.

An alternative syntax colloquially known as the “arrow notation” is easier to read, but requires Perl 5.20+ in some cases. This is the “postfix syntax” illustrated in the table below.

                              Direct           Using References     Using References
                                               Circumfix Syntax[1]   Postfix Syntax

scalar  itself                $s               ${$sr}               $sr->$* [3]
                                                                    
array   itself                @a               @{$ar}               $ar->@* [3]
array   element               $a[0]            ${$ar}[0]            $ar->[0]
array   slice                 @a[0,1,2]        @{$ar}[0,1,2]        $ar->@[0,1,2] [3]
array   index/value slice[2]   %a[0,1,2]        %{$ar}[0,1,2]        $ar->%[0,1,2] [3]
array   last index            $#a              $#{$ar}              $ar->$#* [3]
                                                                    
hash    itself                %h               %{$hr}               $hr->%* [3]
hash    element               $h{'a'}          ${$hr}{'a'}          $hr->{'a'}
hash    slice                 @h{'a','b','c'}  @{$hr}{'a','b','c'}  $hr->@{'a','b','c'} [3]
hash    key/value slice[2]     %h{'a','b','c'}  %{$hr}{'a','b','c'}  $hr->%{'a','b','c'} [3]
                              
code    call                  func(@args)
code    w/ prototype ignored  &func(@args)     &{$cr}(@args)        $cr->(@args)
code    w/ inherited @_       &func            &{$cr}               $cr->&* [3]

glob    itself                *glob            *{$gr}               $gr->** [3]
glob    slot                  *glob{ARRAY}     *{$gr}{ARRAY}        $gr->*{ARRAY} [3]

Notes:

  1. The curly brackets around $sr, $ar, $hr, $cr and $gr are optional when the contents of the curlies is simply a scalar variable.

    If they are used, those curlies form blocks, so they can actually contain multiple statements.

  2. Requires Perl 5.20+.

  3. Requires Perl 5.24+. Available in Perl 5.20+ by adding both use feature qw( postderef ); and no warnings qw( experimental::postderef );, or by adding use experimental qw( postderef );. This is safe because the then-experimental feature was accepted into Perl without change.

See also:

Leave a Comment