Leer un fichero

Marcelo E. Magallón marcelo.magallon en gmail.com
Mar Ago 9 14:20:51 PDT 2005


On 8/9/05, Carlos A. Pitty L. <cpitty at bancouniversal.com> wrote:

> Gracias por la respuesta tan pronta, para aclarar la explicación les envío
> un ejemplo, la línea se vería así:
> 
> 0002006037170201050020000100020000     000508090010002...
> 
> Ahora bien, lo que necesito es tomar los cuatro primeros números y
> almacenarlos en una variable ya que si es 0001 significan algo y si son 0002
> significan otra cosa, luego tomo los 18 siguientes y los almaceno, luego los
> cuatro siguientes, luego los otro cuatros, etc.

Hmm... hay más de una forma de trasquilar ese gato, pero ahorita no se
me ocurre una limpia...

Si todas las líneas se ven igual una cosa tipo:

my @datos = /^(.{4})(.{18})(.{4})(.{4})/;

hace lo que vos escribiste arriba.

El operador m//, en contexto de lista, devuelve en una lista todos los
elementos "capturados", es decir, todos los elementos que concordaron
positivamente con cada patrón dentro de los paréntesis ( ).  Con la
expresión regular escrita arriba eso lo que hace es que busca cuatro
caracteres cualesquiera (".{4}") y los "guarda" ("(.{4})"), luego
busca 18 y los guarda, luego 4 y los guarda, etc.

Luego para accesar la información nada más te fijás en $datos[0],
$datos[1], etc.

Si el formato de la línea depende del valor de los primeros cuatro
caracteres, entonces es más simple algo así tal vez:

my @c = split //;
my $tipo = join '', splice(@c, 0, 4);
if ($tipo eq '0001')
{
}
elsif ($tipo eq '0002')
{
}
...

Mirá la documentación de split, splice y join (e.g. perldoc -f split)

-- 
Marcelo


Más información sobre la lista de distribución Costarica-pm