El problema es el siguiente: tú le das la orden a Net::FTP para que te suba un archivo. Net::FTP le indica al servidor FTP al que se ha conectado que necesita reservar una cierta cantidad de bytes en su sistema de archivos para alojar el archivo que le va a mandar a continuación (o sea, que compruebe que hay espacio suficiente para almacenarlo. Si no, que nos devuelva error). Y... lo que sucede es que el servidor no entiende ese comando.
El comando que Net::FTP envía es el
ALLO (abreviatura de
allocate -reserva-), que
es un comando estándar del FTP, así que el problema está en el lado del servidor: te estás conectando a un servidor, o muy viejo, o mal programado, o muy limitado.
El tema, entonces, es cómo decirle a Net::FTP que no envíe el comando ALLO.
Leyendo el manual, se ve que no dice nada al respecto (hay un método alloc(), pero se refiere a justo lo contrario: sí enviar el comando ALLO al servidor).
En cambio, leyendo el código fuente del módulo, vemos que sí hay una posibilidad: si en lugar de pasar el nombre del archivo local, pasamos un gestor de archivo, entonces no envía el comando ALLO. En el manual, en el método put(), dice que podemos hacerlo, indicándolo en el primer argumento y, en ese caso, estamos obligados a dar el nombre que tendrá el archivo en el sistema remoto.
Sería algo así (no probado):
Using perl Syntax Highlighting
my $ftp = Net::FTP->new($con_tdm{'server'}) or die "Imposible conectar con el servidor: $!\n";
$ftp->login($con_tdm{'user_ftp'},$con_tdm{'pass'}) or die "Login incorrecto: $!\n";
$ftp->binary();
$ftp->cwd('cedula/SRC-BATCH/') or die "No puedo entrar en el directorio destino: $!\n";
open my $fh, "${home}servel/data/ViMaEntRu.txt" or die "No puedo abrir el archivo local: $!\n";
$ftp->put($fh, 'ViMaEntRu') or die "No puedo mandar el archivo: $!\n";
close $fh;
$ftp->quit();
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4