estoy intentando hacer un script que lee un fichero en el que aparece información sobre algunos ficheros que están alojados en distintos servidores que debería después bajar mediante FTP.
El fichero es algo así:
- Código: Seleccionar todo
=============================================================================
Estaciones que hay que procesar
=============================================================================
=============================================================================
SERVER : IGS
=============================================================================
ADDRESS : laquesea
LOGIN : elquesea
PASSWORD : elquesea
DATA : directorioRemoto
=============================================================================
STATION 1 : EBRE
STATION 2 : TLSE
STATION 3 : YEBE
=============================================================================
=============================================================================
SERVER : ICV
=============================================================================
ADDRESS : laquesea
LOGIN : elquesea
PASSWORD : elquesea
DATA : directorioRemoto
=============================================================================
STATION 1 : ALCO
STATION 2 : AYOR
STATION 3 : BORR
STATION 4 : DENI
STATION 5 : MORE
STATION 6 : TORR
STATION 7 : UTIE
STATION 8 : VCIA
=============================================================================
Para cada bloque de datos del fichero tengo el nombre del servidor, la dirección, nombre de usuario,... y finalmente los ficheros que debería descargarme (STATION 1, 2, ...).
El script que he hecho para leer dicho fichero es el siguiente:
Using perl Syntax Highlighting
#usr/bin/perl
use strict;
use warnings;
my $inputFile = "STAT.INP";
#abrir fichero de entrada
open( INP, '<', $inputFile )
or die("Can't read input file $inputFile: $!\n");
my $linea = "";
my $cadena = "";
my @ftpData = ();
while (<INP>) {
if (/^SERVER/) {
#leer el nombre del servidor
$cadena = Extract2ndString( $_, ':\s' );
print "\n|$cadena|\n";
push( @ftpData, $cadena );
$linea = <INP>; #leer linea vacia
#leer la direccion del servidor
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer el nombre de usuario
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer la contraseña de usuario
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer el directorio donde se encuentran los datos
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
$linea = <INP>; #leer linea vacia
#leer todas las estaciones
while ( ( $linea = <INP> ) =~ /^STATIONS/ ) {
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
}
}
}
#cerrar fichero de entrada
close INP;
print "\n\n@ftpData\n";
# ==========================================================================
# SUBRUTINAS
# ==========================================================================
sub Extract2ndString {
# Funcion : Extract2ndString
#
# Descrip : Dada una cadena (que es una linea leida) y un caracter a buscar, extrae la subcadena que hay desde el caracter a
#buscar hasta el final de la linea, eliminando el caracter nueva linea (\n)
#
# Recibe : - linea, incluido el carater nueva linea
# - caracter a buscar
#
# Devuelve: - subcandena
#
# Fecha : 10/12/2008
#my ( $linea, $caracter ) = @_;
my $linea = shift;
my $caracter = shift;
chomp($linea);
my ( $string1, $string2 ) = split /$caracter/, $linea;
return $string2;
}
use strict;
use warnings;
my $inputFile = "STAT.INP";
#abrir fichero de entrada
open( INP, '<', $inputFile )
or die("Can't read input file $inputFile: $!\n");
my $linea = "";
my $cadena = "";
my @ftpData = ();
while (<INP>) {
if (/^SERVER/) {
#leer el nombre del servidor
$cadena = Extract2ndString( $_, ':\s' );
print "\n|$cadena|\n";
push( @ftpData, $cadena );
$linea = <INP>; #leer linea vacia
#leer la direccion del servidor
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer el nombre de usuario
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer la contraseña de usuario
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
#leer el directorio donde se encuentran los datos
$linea = <INP>;
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
$linea = <INP>; #leer linea vacia
#leer todas las estaciones
while ( ( $linea = <INP> ) =~ /^STATIONS/ ) {
$cadena = Extract2ndString( $linea, ':\s' );
print "|$cadena|\n";
push( @ftpData, $cadena );
}
}
}
#cerrar fichero de entrada
close INP;
print "\n\n@ftpData\n";
# ==========================================================================
# SUBRUTINAS
# ==========================================================================
sub Extract2ndString {
# Funcion : Extract2ndString
#
# Descrip : Dada una cadena (que es una linea leida) y un caracter a buscar, extrae la subcadena que hay desde el caracter a
#buscar hasta el final de la linea, eliminando el caracter nueva linea (\n)
#
# Recibe : - linea, incluido el carater nueva linea
# - caracter a buscar
#
# Devuelve: - subcandena
#
# Fecha : 10/12/2008
#my ( $linea, $caracter ) = @_;
my $linea = shift;
my $caracter = shift;
chomp($linea);
my ( $string1, $string2 ) = split /$caracter/, $linea;
return $string2;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
De esta forma obtengo en el array @ftpData toda la información
Pero lo que me gustaría es obtener una matriz en la que la primera fila contuviera los datos de un servidor, en la segunda los de otro, y así con todos los servidores que pudieran haber en el fichero.
De esta manera podría pasar dicha matriz a una subrutina que descargara los datos mediante FTP fila a fila, es decir, que cogiera la primera fila y descargara los ficheros (las STATIONS) desde la posición 5 de la fila hasta el final de la misma, ya que el número de ficheros a descargar no es el mismo para cada fila.
El problema que tengo es que no sé cómo hacer esto, he leído en el libro "Beginning Perl" que eso lo debería hacer mediante referencias, pero entre que soy novato, que lo estoy leyendo demasiado deprisa y mi pobre inglés, no me ha quedado nada claro.
Era por si me podíais indicar dónde encontrar información al respecto.
Además, aunque el script que he hecho funciona a la hora de leer ese fichero, no sé si habría una forma mejor, más clara, más eficiente, ... o lo que sea, de hacerlo, es que no me acaba de convencer del todo...
Un saludo, y gracias.