Search code examples
perlreference

Perl Dereferencing Syntax


What is the syntax to dereference a reference in Perl?


Solution

  • 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: