in reply to Strange "Useless use of constant" message: should not appear at all!

Please note that this:
if (@movement == (0, 1)) {$from = "north"}
is equivalent to
if (@movement == ($any_other_value, 1)) {$from = "north"}
Because it only tests the equivalence between the last element of the list and the array. update: no it doesn't; see above.

You probably want something like

my $from = ""; if ($movement[0] == 0 && $movement[1] == 1) {$from = "north"} elsif ($movement[0] == 1 && $movement[1] == 0) {$from = "east"} elsif ($movement[0] == 0 && $movement[1] == -1) {$from = "south"} elsif ($movement[0] == -1 && $movement[1] == 0) {$from = "west"}
This also solves your warning by the way.

Hope this helps
Joost