@array = ("a", "b", "c", "d"); # @array contains scalars
$array[0]; # use `$` for a single element
@array[0..2]; # use `@` for an array slice
@array = ( [1..5], [6..10] ); # @array now contains array references
$array[0]; # use `$` still because references are scalars
$array[0][1]; # still use `$` even when going multidimensional
@{ $array[0] }; # use `@` to dereference an array ref to array
%hash = ( a => "b", c => "d"); # % for hash of key/value pairs
$hash{a}; # `$` because you're getting a single scalar
@hash{"a","c"}; # `@` because you're getting an array of values
Where things become a bit less regular is the difference between reference and non-reference for hashes and arrays when they are top level. At the top level, you need a `->` but that becomes optional at levels below (because at levels below, they have to be references). $arrayref = [1,1,2,3,5]; # `$` because we're creating an array reference
$arrayref->[0]; # `->` because top level
$arrayref = [ [ 1 ], [ 2 ] ]; # arrayref of arrayrefs
$arrayref->[0][0]; # no second `->`
$arrayref->[0]->[0]; # ... but you can use it if you want!
And then there's stuff like getting a slice out of an arrayref $arrayref = [1,1,2,3,5];
$arrayref->@[0..3]; # oh dear. get a real array with an `@` but not at the start!
So... yeah.Yes, that's probably what I was remembering. Thanks for the exposition.