What was the reason again which Larry rejected unifying the syntax for array and hash indexing?
Because some things have both, and do different things with each. And because some built-in redundancy is useful for error checking, especially on complex nested data structures.
As Piers said, we know whether $a is an array or hash reference when we do: print $a->{foo};
No we don't. Especially if $a is $0 (i.e. the result of a pattern match). See Exegesis 5 for details.
Someone correct me when I go astray...
See above. ;-) Damian