Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl Dereferencing Syntax

Tags:

reference

perl

What is the syntax to dereference a reference in Perl?

like image 241
ikegami Avatar asked Sep 30 '17 22:09

ikegami


People also ask

What is Dereferencing in Perl?

Dereferencing is the way of accessing the value in the memory pointed by the reference. In order to dereference, we use the prefix $, @, % or & depending on the type of the variable(a reference can point to a array, scalar, or hash etc).

What does -> mean in Perl?

The arrow operator ( -> ) is an infix operator that dereferences a variable or a method from an object or a class. The operator has associativity that runs from left to right.

How do I dereference an array in Perl?

Dereferencing an array It is done by placing the @ symbol (the sigil representing arrays) in-front of the reference. This can be written either wrapped in curly braces: @{$names_ref} or without the curly braces: @$names_ref.

What is @$ in Perl?

@$ in the context above is not a variable. It's a dereference. $tp is a reference to an array. @$tp says "dereference and give me the values", it could also be written as @{$tp} .


1 Answers

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:

  • References Quick Reference
  • perlref
  • perlreftut
  • perldsc
  • perllol
like image 175
ikegami Avatar answered Sep 29 '22 12:09

ikegami