Section 11.1. Dereferencing


11.1. Dereferencing

Wherever possible, dereference with arrows.

Use the -> notation in preference to "circumfix" dereferencing. In other words, when you're accessing references to containers, use the arrow syntax:

      print 'Searching from ', $list_ref->[0] ,  "\n",           '            to ', $list_ref->[-1] , "\n";

This style results in much cleaner code than explicit wrap-and-prefix dereferencing:

     print 'Searching from ', ${$list_ref}[0],  "\n",           '            to ', ${$list_ref}[-1], "\n";

Note that the arrow syntax also interpolates correctly into strings, so the previous example would be better written:

      print "Searching from $list_ref->[0]\n",           "            to $list_ref->[-1]\n";

Explicit dereferencing is prone to two specific mistakes, which can be hard to detect if use strict is not in effect. The first error is simply forgetting to wrap-and-prefix at all:

     print 'Searching from ', $list_ref[0],  "\n",           '            to ', $list_ref[-1], "\n";

The second mistake is wrapping-and-prefixing correctly, but accidentally leaving off the reference variable's own sigil (i.e., the one inside the braces):

     print 'Searching from ', ${list_ref}[0],  "\n",           '            to ', ${list_ref}[-1], "\n";

In both cases, the array accesses are accessing the variable @list_ref instead of the array referred to by the reference in $list_ref.

Of course, if you need to access more than one element of a container (i.e., to slice it) via a reference to that container, there's no choice except to use the wrap-and-prefix syntax:

      my ($from, $to) = @{$list_ref}[0, -1];

Attempting to use the arrow notation to achieve the same effect doesn't work:

     my ($from, $to) = $list_ref->[0, -1];

Because the access expression ($list_ref->[0, -1]) begins with a $ sigil, the square brackets are treated as a scalar context, so the list of indices is evaluated in scalar context, and the result is just the final index. So the previous example is equivalent to:

     my ($from, $to) = ($list_ref->[-1], undef);



Perl Best Practices
Perl Best Practices
ISBN: 0596001738
EAN: 2147483647
Year: 2004
Pages: 350
Authors: Damian Conway

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net