RE:como crear archivos de acceso directo con perl?
Pues eso, archivos... DBD::RAM te permite tener la agenda en ficheros de texto con campos de tamaño fijo, lo que querías.
Otra opción es usar campos separados con comas (CSV), y para ello hay un par de módulos, como el Text::CSV, pero seguro que hay otro más moderno.
Y si quieres acceder 'directamente', te lo tienes que hacer con pack/unpack/printf/sprintf/substr.
Quizás con substr sea una opción, pero desde luego con pack queda mucho mas clara.
Partiendo de esta 'base de datos':
---------------------------------------------------------------------------------------------
Nombre Apellidos Dirección
Joaquin Ferrero San Pedro C/ La Vida 88, 6
rrcoolb001 No lo se C/ No se sabe donde
------------------------------------------------------------------------------------------------
La primera solución lo hace con substr:
#!/usr/bin/perl -w
use strict;
my $FicheroAgenda = 'base.txt';
# Descripción de la agenda:
# Cada clave es el nombre del campo
# Cada valor es un array con dos valores:
# El primero indica la posición de inicio
# El segundo, la longitud
my %formatoagenda = (
nombre => [ 0, 20],
apellidos => [20, 30],
direccion => [50, 40],
);
# Leemos la agenda
my @agenda = do { open AGENDA,"<$FicheroAgenda"; <AGENDA> };
# Quitamos los encabezados
shift @agenda;
# Sacamos los nombres
my %entrada;
foreach my $entrada ( @agenda )
{
chomp($entrada);
foreach my $campo ( keys %formatoagenda )
{
$entrada{$campo} = substr($entrada, $formatoagenda{$campo}[0], $formatoagenda{$campo}[1]);
}
# A pantalla
printf "%-*s|%-*s|%-*s\n",
$formatoagenda{nombre}[1], $entrada{nombre},
$formatoagenda{apellidos}[1], $entrada{apellidos},
$formatoagenda{direccion}[1], $entrada{direccion};
}
------------------------------------------------------------------------------------------------------------
La segunda solución consiste en sustituir el foreach my $campo.... por esta línea:
-------------------------------------------------------------------------------------------------------------
($entrada{nombre}, $entrada{apellidos}, $entrada{direccion}) = unpack("A20 A30 A40",$entrada);
-------------------------------------------------------------------------------------------------------------