En la línea 53 tienes esto:
while (($key, $value) = each($text)) {
La función each() solo se aplica a un hash (y a un array, en las últimas versiones de Perl). Y lo que tienes es un escalar.
Eso es justo lo que dice el mensaje de error: "El tipo del argumento 1 a each() debe ser un
hash (no una variable privada)".
Edito: solo en las versiones de Perl a partir de 5.14 se puede pasar a each() una referencia a un
hash, que es justo lo que $text contiene al recibir la decodificación del JSON. Así que lo que te pasa es que tienes distintas versiones de Perl en la máquina local y en el servidor.
Puedes solventarlo desreferenciando el
hash:
while (($key, $value) = each %$text) {
Edito: La línea
print "Content-type: application/json\n\n";
queda mejor si en el primer print del programa lo pones así:
print header('application/json');
(Curiosamente, esta línea sale al principio del manual de
CGI)