• Publicidad

Abrir directorio, leer todos los archivos y unirlos

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

Re: Abrir directorio, leer todos los archivos y unirlos

Notapor pablgonz » 2012-06-08 17:39 @777

Muchas gracias, explorer, ahora funciona a la perfección. Con esto puedo solucionar (cuando tenga tiempo), otro hilo que dejé pendiente hace algún tiempo y donde me sucedía lo mismo (problema de fin de línea)... Llegué a pensar que era por la codificación del archivo (UTF8, cp1252, etc...) pero como siempre trabajo en TeX, se me había olvidado lo de los finales de línea.

Y las consultas (obvio por parte mía) para cerrar el tema:
1- El script que genera los archivos en los directorios images/ corre en Windows y en Linux. ¿Creará distintos finales de línea dependiendo del sistema en el que se corra? ¿O depende del fichero de entrada?

2- Noté que utilizas palabras con tilde. En Linux se muestran sin problema, pero en Windows no. ¿Por qué?

Saludos
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Abrir directorio, leer todos los archivos y unirlos

Notapor explorer » 2012-06-08 18:25 @809

pablgonz escribiste:1- El script que genera los archivos en los directorios images/ corre en Windows y en Linux. ¿Creará distintos finales de línea dependiendo del sistema en el que se corra? ¿O depende del fichero de entrada?
Por defecto, y si no decimos nada, Perl convertirá cada final de línea, del archivo que estemos leyendo, desde su codificación especial (uno, dos, o más caracteres), a "\n". Y para la salida, hará el proceso contrario: convertirá cada "\n" que pongamos en los print() y en los say(), por la codificación adecuada para los finales de línea, según el sistema operativo en donde estemos.

Así que sí: Perl, en Windows, escribirá todos los "\n" como "\r\n". Y el mismo programa escribirá distintos finales de línea cuando esté en Linux, MacOs, etc.

En la mayor parte de las ocasiones, eso no será un problema, porque es justo lo que queremos.

El problema viene cuando queremos procesar archivos que vienen de otros sistemas operativos. O cuando generamos archivos que serán llevados a otros sistemas operativos (que serán luego procesados por otros programas, así que éstos estarán esperando que sus finales de línea estén bien).

Resumen: ¡coherencia! O... un plan.

Perl puede hacer, por ejemplo, desde Linux, leer y escribir archivos MSDOS, en lugar de archivos con finales de línea Unix.

Basta con poner en la parte de arriba del programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open IO => ':crlf';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y con eso indicamos que, por defecto, toda la salida y la entrada debe pasar por la capa de de Entrada/Salida ':crlf'.

Más información en perldoc -f open, perldoc perlopentut y perldoc open.

pablgonz escribiste:2- Noté que utilizas palabras con tilde. En Linux se muestran sin problema, pero en Windows no. ¿Por qué?
Si no decimos nada, Perl saca los textos sin ningún tipo de traducción, tal como estén escritos en el programa.

Si salen mal en Windows es porque, quizás, has escrito el programa en un editor, con codificación ANSI o cp1252, y a la hora de ejecutarlo, en la ventana de línea de comandos del MSDOS, esa ventana está en codificación cp850 o cp852.

En ese caso, pones al principio del programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use open OUT => ":encoding(cp850)";     # toda salida, por defecto, será en CP850
use open ':std';                        # incluido STDOUT
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ejemplo
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Anterior

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 22 invitados