← Perl EspañolChapter 09 of 13

Entrada/Salida de Archivos

## Objetivos de Aprendizaje - Abrir y cerrar filehandles - Leer de archivos - Escribir a archivos - Usar operaciones de directorios - Trabajar con pruebas de archivos - Manejar datos binarios ## Filehandles ### Abriendo Archivos ```perl use strict; use warnings; # Leer de archivo open my $fh, "<", "entrada.txt" or die "No se puede abrir: $!"; # Escribir a archivo (sobreescribir) open my $fh, ">", "salida.txt" or die "No se puede abrir: $!"; # Agregar a archivo open my $fh, ">>", "registro.txt" or die "No se puede abrir: $!"; # Leer/Escribir (lectura + escritura, truncar) open my $fh, "+>", "temp.txt" or die "No se puede abrir: $!"; # Leer/Escribir (lectura + escritura, no truncar) open my $fh, "+<", "temp.txt" or die "No se puede abrir: $!"; ``` ### Apertura de Tres Argumentos ```perl # Forma moderna (recomendada) open my $fh, "<", "nombrearchivo.txt" or die "No se puede abrir: $!"; # Con codificacion open my $fh, "<:encoding(UTF-8)", "archivo.txt" or die "No se puede abrir: $!"; # Binario puro open my $fh, "<:raw", "binario.dat" or die "No se puede abrir: $!"; ``` ### Cerrando Archivos ```perl close $fh or die "No se puede cerrar: $!"; ``` ## Leyendo de Archivos ### Lectura Linea por Linea ```perl use strict; use warnings; open my $fh, "<", "entrada.txt" or die "No se puede abrir: $!"; while (my $linea = <$fh>) { chomp $linea; print "Leido: $linea\n"; } close $fh; ``` ### Leer en Arreglo ```perl open my $fh, "<", "entrada.txt" or die "No se puede abrir: $!"; my @lineas = <$fh>; close $fh; # Mas eficiente - leer archivo completo open my $fh, "<", "entrada.txt" or die "No se puede abrir: $!"; my $contenido = do { local $/; <$fh> }; # Modo slurp close $fh; ``` ### Leer Todas las Lineas ```perl # Usando File::Slurp (modulo CPAN) use File::Slurp qw(read_file write_file); my @lineas = read_file("archivo.txt"); my $contenido = read_file("archivo.txt"); ``` ## Escribiendo a Archivos ### Imprimir a Filehandle ```perl use strict; use warnings; open my $fh, ">", "salida.txt" or die "No se puede abrir: $!"; print $fh "Hola, Mundo!\n"; print $fh "Linea 2\n"; close $fh; ``` ### printf a Archivo ```perl open my $fh, ">", "datos.txt" or die "No se puede abrir: $!"; printf $fh "Nombre: %-10s Edad: %3d\n", "Alice", 30; printf $fh "Nombre: %-10s Edad: %3d\n", "Bob", 25; close $fh; ``` ### write (Formateado) ```perl use strict; use warnings; format ESTUDIANTE = @<<<<<<<<<<< @>> @####.## Nombre: Edad: GPA ~~ ~~ ~~~~~ . # Escribir usando formato open my $fh, ">", "estudiantes.txt" or die "No se puede abrir: $!"; select $fh; write; select STDOUT; close $fh; ``` ## Filehandles Estandar ### STDIN, STDOUT, STDERR ```perl use strict; use warnings; # Leer de STDIN print "Ingresa tu nombre: "; my $nombre = ; chomp $nombre; # Imprimir a STDOUT print STDOUT "Hola, $nombre!\n"; # Imprimir a STDERR print STDERR "Mensaje de error\n"; ``` ### Redirigiendo Salida ```perl # Redirigir STDERR a STDOUT print STDERR "Error\n"; # Va a stderr # Combinado open my $log, ">>", "registro.txt" or die "No se puede abrir: $!"; print $log "Mensaje\n"; # Agrega al registro close $log; ``` ## Pruebas de Archivos ### Operadores de Prueba ```perl use strict; use warnings; use -e File::Spec; my $archivo = "test.txt"; -e $archivo; # Existe? -r $archivo; # Legible? -w $archivo; # Escribible? -x $archivo; # Ejecutable? -f $archivo; # Archivo regular? -d $archivo; # Directorio? -l $archivo; # Enlace simbolico? -s $archivo; # Tamano en bytes (retorna tamano o undef) -z $archivo; # Archivo vacio? -T $archivo; # Archivo de texto? -B $archivo; # Archivo binario? ``` ### Ejemplos de Pruebas de Archivo ```perl use strict; use warnings; my $archivo = "datos.txt"; if (-e $archivo) { print "El archivo existe\n"; if (-r $archivo && -w $archivo) { print "El archivo es legible y escribible\n"; } if (-s $archivo > 1024) { print "El archivo es mayor que 1KB\n"; } } else { print "El archivo no existe\n"; } ``` ### Pruebas Apiladas ```perl my $archivo = "test.txt"; if (-r -w -x $archivo) { print "Permisos completos\n"; } if (-o $archivo) { # Propiedado por usuario actual print "Eres dueno de este archivo\n"; } ``` ## Operaciones de Directorio ### Leyendo Directorios ```perl use strict; use warnings; opendir my $dh, "." or die "No se puede abrir dir: $!"; while (my $entrada = readdir $dh) { next if $entrada =~ /^\./; # Saltar archivos ocultos print "$entrada\n"; } closedir $dh; ``` ### Globbing ```perl use strict; use warnings; # Todos los archivos que coinciden con patron my @pl_files = glob "*.pl"; my @pl_files = <*.pl>; # Todos los archivos recursivamente (Perl 5.10+) use File::Glob qw(bsd_glob); my @todos = bsd_glob("**/*", GLOB_NOCHECK); ``` ### Creando Directorios ```perl use strict; use warnings; mkdir "nuevodir", 0755 or die "No se puede crear: $!"; # Crear directorio recursivamente use File::Path qw(make_path); make_path("ruta/a/dir/profundo"); # Remover directorio (debe estar vacio) rmdir "dirvacio" or die "No se puede remover: $!"; ``` ### Removiendo Archivos ```perl use strict; use warnings; unlink "archivo_a_eliminar.txt" or die "No se puede eliminar: $!"; # Remover multiples unlink "a.txt", "b.txt", "c.txt"; # Remover con verificacion unlink "viejo.txt" if -e "viejo.txt"; ``` ## Manipulacion de Rutas ### File::Spec ```perl use strict; use warnings; use File::Spec; my $ruta = File::Spec->catfile("dir", "subdir", "archivo.txt"); # Construccion de rutas multiplataforma my $completo = File::Spec->catpath("C:", "Usuarios", "test.txt"); ``` ### Path::Tiny (CPAN) ```perl use Path::Tiny; my $ruta = path("dir/archivo.txt"); $ruta->slurp; # Leer contenido $ruta->spew("contenido"); # Escribir contenido $ruta->exists; $ruta->is_file; $ruta->is_dir; $ruta->parent; # Directorio padre $ruta->child("sub"); # Ruta hija ``` ## Trabajando con Rutas de Archivos ### Extrayendo Componentes ```perl use strict; use warnings; use File::Basename; my $ruta = "/home/usuario/docs/archivo.txt"; my $nombrearchivo = fileparse($ruta); # "archivo.txt" my $nombredir = dirname($ruta); # "/home/usuario/docs" my $extension = fileparse($ruta, qr/\.[^.]*/); # ".txt" ``` ### Informacion de Ruta ```perl use File::Basename; my $ruta = "/home/usuario/docs/archivo.txt"; my ($nombre, $dir, $ext) = fileparse($ruta, qr/\.[^.]*/); print "Nombre: $nombre, Dir: $dir, Ext: $ext\n"; ``` ## Datos Binarios ### Leyendo Binario ```perl use strict; use warnings; open my $fh, "<:raw", "imagen.png" or die "No se puede abrir: $!"; binmode $fh; # Importante en Windows my $datos; { local $/; # Modo slurp $datos = <$fh>; } close $fh; print length($datos), " bytes\n"; ``` ### Escribiendo Binario ```perl use strict; use warnings; open my $fh, ">:raw", "salida.bin" or die "No se puede abrir: $!"; binmode $fh; print $fh $datos_binarios; close $fh; ``` ## Archivos Temporales ### Archivos Temporales Nombrados ```perl use strict; use warnings; use File::Temp qw(tempfile); my ($fh, $nombrearchivo) = tempfile( "prefijoXXXXX", # Plantilla con X's para caracteres aleatorios DIR => "/tmp", SUFFIX => ".txt", ); print $fh "Contenido temporal\n"; close $fh; unlink $nombrearchivo if -e $nombrearchivo; ``` ### Archivo TemporalAnonimo ```perl use File::Temp qw(tempfile); my ($fh, $nombrearchivo) = tempfile(); print $fh "Contenido temporal\n"; close $fh; unlink $nombrearchivo; ``` ## Manejo de Errores ### Verificando Exito de Apertura ```perl use strict; use warnings; open my $fh, "<", "inexistente.txt" or die "No se puede abrir archivo: $!"; # O con or open(my $fh, "<", "archivo.txt") || die "No se puede abrir: $!"; # Error personalizado open my $fh, "<", "archivo.txt" or die "No se puede abrir 'archivo.txt': $!"; ``` ### La Variable $! en Perl ```perl open my $fh, "<", "archivo.txt" or do { warn "Error: $!"; return; }; ``` ## Resumen - Usa `open` con tres argumentos para seguridad - `<$fh>` lee una linea, `<$fh>` en contexto de lista lee todo - `print $fh` escribe a archivo - `close $fh` cuando termines - Pruebas de archivos: `-e`, `-r`, `-w`, `-f`, `-d`, `-s` - `opendir`/`readdir` para directorios - `glob` o `` para globbing de archivos - `mkdir`/`rmdir` para operaciones de directorio - `unlink` para eliminar archivos - Usa `binmode` para datos binarios - File::Temp para archivos temporales

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →