Página 1 de 1

Lectura de fichero con formato a un hash

NotaPublicado: 2007-01-23 02:38 @151
por fgalves
Hola a todos,

El caso es que estoy intentando leer un fichero y guardar la información en un hash.
El formato del fichero es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Config file for automated ftp transfer


#Environment:NT
NT_user = pepito
NT_password = djsjjsj
NT_host = www.pepitolandia.net

#path1, report/s
NT_path = /amparito/pepito/Inputs/
NT_ReportList = (PEPE MANOLO AMPARO JOSE JUAN)

...

#Environment:MVS
MVS_user = cocouaua
MVS_password = pozi
MVS_host = pepito.mecome.lafruta

#path1, report/s
MVS_path = 'PEPE.PEPITO.BONITO'
MVS_ReportList = (SANDRA)

#path2, report/s
MVS_path = 'JOSE.JOSELITO.BONITO'
MVS_ReportList = (SAS)
...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4




Es decir, un fichero conteniendo uno o mas "Environments". Cada environment contiene la definición del (user, password y host), y a continuación una lista de parejas (path, reportList); para un "environment" puede haber una o más parejas (path, reportList).

Mi idea era guardar todo eso en un hash con el aspecto siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%reports = (
    'NT' => {
                 user => pepito
                 password => djsjjsj
                 host => www.pepitolandia.net
                 reportsList => {
                                         path1 => (PEPE MANOLO AMPARO JOSE ..)
                  }
                 }
     'MVS' =>{....}
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



El problema que tengo, es que no se muy bien el algoritmo a aplicar para leer de un fichero e ir rellenando el hash. La dificultad radica en que no se la longitud del fichero, es decir, desconozco cuantas secciones "environment" hay, y para cada una de ellas, desconozco el numero de pares (path, reportList).

Mi primer intento es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(CFGFILE,$configFile);
    while (my $l = <CFGFILE>) {
        if ($l =~ /^\#Environment:(\S+)/) {
            $environment = $1;
            while (my $l = <CFGFILE>)
            {
                if ($l =~ /user = (\S+)/)
                {
                    $user = $1;
                }
                if ($l =~ /password = (\S+)/)
                {
                    $password = $1;
                }
                if ($l =~ /host = (\S+)/)
                {
                    $host = $1;
                }
                $reports{$environment} = (
                                          'user' => $user,
                                          'password' => $password,
                                          'host' => $host,
                                          'reports' => ());
               
                if ($l =~ /path = (\S+)/)
                {
                    $path = $1;
                    while (my $l = <CFGFILE>)
                    {
                        if ($l =~ /ReportList = (\((.+)\)/ )) {
                            $reports{$environment}{reports}{$path}= $1;
                        }
                    }
                }
            }
        }
       
    }
    close(CFGFILE);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero evidentemente no funciona como yo deseo.
¿Alguien me puede echar una mano?
¡¡Muchisimas gracias!!
Felipe

NotaPublicado: 2007-01-23 07:22 @348
por explorer
No está muy claro qué es lo que hay que hacer con la entrada path. Según tu descripción no hay que hacer nada, pero en el código sí que lo usas.

NotaPublicado: 2007-01-23 07:36 @358
por explorer
No es necesario interpretar las líneas que empiezan por '#', ya que la información de los entornos está delante de cada una de las líneas.

Entonces, en cada línea, obviamos las líneas que no siguen el patrón 'entorno_variable = valor'. Y del resto, sacamos la información y la guardamos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Data::Dumper;
use warnings;
use strict;

open my $conf, '<', 'kk.txt'
    or die "ERROR: No pude abrir la configuración: $!\n";

my %reports;

while ( my $linea = <$conf> ) {
    if ( my ($entorno, $variable, $valor) = $linea =~ /([^_]+?)_(\w+) *= *(.+)/ ) {

        next if $variable eq 'path';

        if ( $variable eq 'ReportList' ) {
            my $keypath = 'path' . (1 + scalar keys %{$reports{$entorno}{ReportList}});
            $reports{$entorno}{ReportList}{$keypath} = $valor;
        }
        else {
            $reports{$entorno}{$variable} = $valor;
        }
    }
}
close $conf;
print Dumper \%reports;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Salida:
Código: Seleccionar todo
$VAR1 = {
          'NT' => {
                    'ReportList' => {
                                      'path1' => '(PEPE MANOLO AMPARO JOSE JUAN)'
                                    },
                    'password' => 'djsjjsj',
                    'user' => 'pepito',
                    'host' => 'www.pepitolandia.net'
                  },
          'MVS' => {
                     'ReportList' => {
                                       'path2' => '(SAS) ',
                                       'path1' => '(SANDRA)'
                                     },
                     'password' => 'pozi',
                     'user' => 'cocouaua',
                     'host' => 'pepito.mecome.lafruta'
                   }
        };

NotaPublicado: 2007-01-23 08:32 @397
por fgalves
Muchas gracias Explorer!

Lo unico es que tal y como me advertiste en tu mensaje anterior, estoy perdiendo una informacion, el path.
Voy a intentar modificar la estructura del hash para guardar tambien el path, pues tambien lo necesito.
Os tengo al corriente.
Muchisimas gracias!
Saludos,
Felipe