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 →