• Publicidad

Duda básica sobre verificación contenido variable

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

Duda básica sobre verificación contenido variable

Notapor fgalves » 2006-10-25 16:22 @723

Hola a todos,

Tengo una duda bastante básica así que supongo que me podréis ayudar:

Tengo un fichero de configuración (FTP.cfg) en el que guardo datos que luego serán usados por un script perl para realizar una conexión FTP para el envío de una serie de ficheros:

Ejemplo de un "cat FTP.cfg":

Código: Seleccionar todo
user = pepito
password = frijolito
host = Gavilan
path = /pepito/juanito/


El hecho es que tengo un script perl que parsea dicho fichero de conflagración y que guarda en respectivas variables el contenido de dichos campos:
En $user guardaría "pepito" ,en $password "frijolito" y así sucesivamente, para luego efectuar el FTP.

Lo que yo deseo, y ahí es donde entráis vosotros como expertos, es añadir una condición en mi script. Quiero que el FTP sea efectuado únicamente si todas las variables anteriores son diferentes de vacío o "".
Es decir, que si en el fichero de configuración anterior, algunas de las variables no está informada, pues la conexión FTP no se efectúe.

Lo que yo he pensado es lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (($user ne "") && ($password ne "") && ($host ne "") && ($path ne ""))
{ ejecutar FTP}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



El problema es que si tengo un fichero de configuración del estilo:

Código: Seleccionar todo
user =
password =
host =
...

no sé si realmente lo que habré guardado en $user, $password y $host será en realidad la cadena vacía ("") o si en realidad pueda haber también espacios en blanco o saltos de línea, y por lo tanto, como tratarlos.

Aquí les pongo el código de parseo contenido en mi script perl para el parseo de dicho fichero de configuración
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 open(CFGFILE,$configFile);
    while (my $l = <CFGFILE>) {
        if ($l =~ /^user = (\S+)/) {
            $user = $1;
        }
        if ($l =~ /^password = (\S+)/) {
            $password = $1;
        }
        if ($l =~ /^host = (\S+)/) {
            $host = $1;
        }
        if ($l =~ /^path = (\S+)/) {
            $path = $1;
        }
     }
    close(CFGFILE);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguien me puede echar una manita?
¿Es buena la condición que expongo más arriba o es mejor cambiarla por otra conteniendo expresiones regulares?

Disculpas por alargarme tanto pero a veces no es fácil exponer una duda en Perl sin exponer algunos detalles.

Muchas gracias por todo y espero impaciente vuestros comentarios,
Cordialmente,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor kondenado » 2006-10-25 17:38 @776

Puedes agregar una línea como esta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
die "error en los datos\n" if !($user,$password,$host,$path);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Perl programming
Avatar de Usuario
kondenado
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2006-08-21 18:57 @831

Notapor kondenado » 2006-10-25 17:49 @784

Incluso podrías achicar un poco el código, pero es cosa de cada uno :wink:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
my $configFile;
open(CFGFILE, < $configFile) || die "(File error): $!\n";
my @file = <CFGFILE>;
close CFGFILE;
foreach(@file){
   my $user = $1 if($_ =~ /user\s=\s(\w+)/);
   my $password = $1 if($_ =~ /password\s=\s(\w+)/);
   my $host = $1 if($_ =~ /host\s=\s(\w+)/);
   my $path = $1 if($_ =~ /path\s=\s(\w+)/);
}
die "error en los datos\n" if !($user,$password,$host,$path);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Perl programming
Avatar de Usuario
kondenado
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2006-08-21 18:57 @831

Notapor explorer » 2006-10-25 20:05 @878

Lo siento, kondenado. Eso no funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
explorer@casa:~> perl -e '$path="/";die "error en los datos\n" if !($user,$password,$host,$path);'
explorer@casa:~>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No funciona porque el resultado de ejecutar la lista de variables escalares es siempre el último elemento de la lista (Ver construcciones de listas de valores).

Así que, mientras $path puede tener cualquier valor no nulo, el resto de variables pueden estar indefinidas, vacías o lo que sea.

Yo he encontrado esta otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach ($user,$password,$host,$path) { die "error en los datos\n" unless $_ }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 » 2006-10-25 20:43 @905

Si yo estuviera usando el módulo Net::FTP o alguna de sus variantes, no miraría el fichero de configuración para ver si está mal. Simplemente inicio la conexión y si falla, falla (o digo al menos porqué ha fallado). Esto permite, por ejemplo, que un día alguien quiera hacer un ftp a un sitio donde el path no sea necesario o la contraseña sea nula.

Una forma que ahorra tiempo en el tema de ficheros de configuración es... que también sean ficheros Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$user     = 'pepito';
$password = 'frijolito';
$host     = 'Gavilan';
$path     = '/pepito/juanito/';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Luego, en el programa principal, sólo tengo que hacer un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
do 'FTP.cfg';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ya está leído.

Pero... supongamos que estamos obligados a leer el fichero con el formato que indica fgalves. Es casi seguro que este problema ya se lo encontró alguien más antes que nosotros... ergo alguien lo ha tenido que resolver. Y sí... la lectura de ficheros de configuración es algo tan normal que para Perl hay unos cuantos módulos.

Por ejemplo... Config::General:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Config::General;

my %config = ParseConfig('FTP.cfg');

die "error en los datos\n" if 4 != scalar keys %config;

print "Conexión a host $config{host}...";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y con la sorpresa de que además nos simplifica la comprobación del número de datos leídos.
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 » 2006-10-26 01:48 @116

La siguiente instrucción:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach ($user,$password,$host,$path) { die "error en los datos\n" unless $_ }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Funciona aunque en $user... ¿haya vacíos o saltos de línea?
Pura curiosidad antes de usarla...
¡¡¡Gracias!!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-10-26 05:13 @259

La línea morirá en cuanto encuentre que una de las cuatro variables es una cadena vacía, un '0', o el valor infinido. Un salto de línea es un carácter válido y seguirá.

Generalmente funcionará bien, salvo que alguno de los cuatro valores valga alguno de los valores que en Perl significan falso.
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


Volver a Básico

¿Quién está conectado?

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