• Publicidad

Lectura de fichero con formato a un hash

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Lectura de fichero con formato a un hash

Notapor fgalves » 2007-01-23 02:38 @151

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.003 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
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-01-23 07:22 @348

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2007-01-23 07:36 @358

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.002 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'
                   }
        };
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor fgalves » 2007-01-23 08:32 @397

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
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron