The arrow operator is optional everywhere except the first dereference.
ie.
$array[0][1] is the same as
$array[0]->[1].
In both cases, you have an array (
@array) in which the first element (
$array[0]) is a reference to another array.
$array[0] is not the same as
$array->[0] however.
In the first case, you are accessing the first element of
@array. In the second, you are accessing the first element of the array that is referenced by
$array (note: $array is a scalar holding a reference to an array).
As for your question about:
$$player_dbref{player_name}{ip_addr} for the player's IP and $$player_dbref{player_name}{ip_addr}{id} to get the user id.
You can't do that, because $$player_dbref{player_name}{ip_addr} cannot hold both the value of the players IP, and a reference to another hash.
What you may want is:
$$player_dbref{player_name}{ip_addr} = "1.2.3.4";
$$player_dbref{player_name}{id} = 007;
In this case you have a reference (
$player_dbref) to a hash of player names, the values of which, are another hash which holds IP, id, etc.