11.1. Dereferencing
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); |