El caso es que estoy intentando leer un fichero y guardar la información en un hash.
El formato del fichero es el siguiente:
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)
...
#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.004 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:
Using perl Syntax Highlighting
%reports = (
'NT' => {
user => pepito
password => djsjjsj
host => www.pepitolandia.net
reportsList => {
path1 => (PEPE MANOLO AMPARO JOSE ..)
}
}
'MVS' =>{....}
);
'NT' => {
user => pepito
password => djsjjsj
host => www.pepitolandia.net
reportsList => {
path1 => (PEPE MANOLO AMPARO JOSE ..)
}
}
'MVS' =>{....}
);
Coloreado en 0.002 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:
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);
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.003 segundos, usando GeSHi 1.0.8.4
Pero evidentemente no funciona como yo deseo.
¿Alguien me puede echar una mano?
¡¡Muchisimas gracias!!
Felipe