in reply to difference between @, $

In the first case, you are assigning to an array @a. The first element of the array will be the reference to the anonymous array containing 4 values.
In the second case, you assign the reference directly to a scalar variable $a.
Or, as SuicideJunkie put it in the CB: in the first case, $a[0][2] == 3 and in the second case, $a->[2] == 3