I find that, especially with complex data structures, the
-> notation can clarify things by seperating my identifiers.
You also pick as examples of dereferencing notations that can tend to look complex to an inexperienced programmer whether they are references or not. All of the examples you cite for complexity can be rewritten using less confusing notations.
for (0 .. $#{$aref}) {}
# or
for (@$aref) {}
@{$aref2} = ...;
#or
@$aref2 = ...;
I'm not sure why you don't show that the curly braces can be left out during dereferencing.