• Publicidad

De DOS a UNIX

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

De DOS a UNIX

Notapor lyna041 » 2008-02-12 10:57 @497

Hola,
tengo un problema con los formatos de dos y unix.
He sacado este código de los tutoriales de la web, en el que se hace un upload de un formulario.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @pairs = $query->param;
my $nombre_archivo = "/tmp/Archivo.txt";
my $manipulador = $query->upload($pair);

#Abrimos el nuevo archivo
open (OUTFILE, ">$nombre_archivo") || die "No se puedo crear el archivo";
binmode(OUTFILE); #Para no tener problemas en Windows

#Transferimos byte por byte el archivo
while (my $bytesread = read($manipulador, my $buffer, 1024)) {
print OUTFILE $buffer;
}

#Cerramos el archivo creado
close (OUTFILE);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero el fichero resultante tiene formato DOS (cuando el cliente es Windows) y los demás scripts no lo reconocen. ¿Como podría transformarlo a UNIX? Me imagino que con MAC habrá el mismo problema. ¿Hay alguna forma de generalizar los formatos de entrada?
Muchas gracias.
lyna041
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-02-27 10:50 @493

Publicidad

Notapor explorer » 2008-02-12 13:33 @606

Supongamos que es un fichero de texto lo que recibes y que el único problema (en realidad hay más) son los finales de línea.

Bueno, una solución cómoda sería usar una expresión regular para cambiar los finales de línea a lo que tu deseas. Por este foro creo recordar que hay algún ejemplo.

Es MUY recomendable que leas la parte CREATING A FILE UPLOAD FIELD (completo: hay algunos comentarios al tratamiento texto-binario de esos ficheros).

Una posible solución para lo que planteas es usando la función uploadInfo(), que devuelve el Content-type del fichero enviado y de esa manera saber qué es lo que han enviado.

Dices que cuando el cliente es Windows, el fichero enviado está en formato DOS. Se supone que estás en un servidor Unix/Linux. Entonces con el típico bucle while(<>){ print } tendría que ser suficiente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor lyna041 » 2008-02-13 07:58 @373

Al final lo he solucionado como me has dicho, con expresiones regulares, y funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @pairs = $query->param;
my $nombre_archivo = "/tmp/Archivo.txt";
my $manipulador = $query->upload($pair);

open (OUTFILE, ">$nombre_archivo") || die "No se puedo crear el archivo";

#Transferimos el archivo
while (<$manipulador>) {
        if (s/\r\n/\n/){ #DOS a UNIX    
        }
        else { #MAC a UNIX
                s/\r/\n/;
        }
        print OUTFILE;
}
#Cerramos el archivo creado
close (OUTFILE);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias!
lyna041
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-02-27 10:50 @493

Notapor explorer » 2008-02-13 09:03 @419

Creo que entonces se puede resumir las dos regex en:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
s/\r\n?/\n/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y te ahorras el 'if'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron