• Publicidad

hashes

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

hashes

Notapor nany » 2007-02-28 13:22 @599

Hola ya estoy ahora por aquí.

Quisiera saber si pueden ayudarme con el tema de hash.

Es que aun no logro entenderlas muy bien.

Esto es mi código. explorer me dio una solución y así la aplique pero lo que pasa es que me hacen falta llaves.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/env perl
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my $f_Archivo_de_Entrada2 = " /export/home/sistemas/nolvera/perl/expresiones/licencias.cfg";
my $f_Archivo_de_Salida  = "/export/home/sistemas/nolvera/perl/expresiones/salida/SHCP";
my $f_Archivo_de_salida2 = "/export/home/sistemas/nolvera/perl/expresiones/salida/BANXICO";
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
%s_cliente1;
%s_cliente2;
$s_Nodo;
######################
#Abrir archivo
######################
open IN, "$f_Archivo_de_Entrada2";
while (<IN>){
              my $s_Linea1 = $_;
              chomp $s_Linea1;
              my @a_Lineas1 = split ',', $s_Linea1;
              $s_Nodo = $a_Lineas1[0];
              $s_cliente1{$a_Lineas1[0]}=$s_Linea1[1];
              $s_cliente1{$a_Lineas1[1]}=$s_Linea1[2];
              $s_cliente1{$a_Lineas1[2]}=$s_Linea1[3];
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4
nany
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-12-11 13:36 @608

Publicidad

Notapor explorer » 2007-02-28 17:08 @756

Yo es que aún no me entero de lo que quieres hacer.

¿No puedes poner un ejemplo de los ficheros de entrada, aunque sean con datos FALSOS?
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 nany » 2007-03-02 14:37 @651

Hola.

Pues mira los ficheros son más o menos así.
Tengo dos archivos de entrada. El primero es un archivo de configuración como este:
Código: Seleccionar todo
COMISION,licencia1,licencia2,licencia3
COMISION2,licencia8,licencia5,licencia10

y el segundo fichero contiene las licencias completas, es decir así:
Código: Seleccionar todo
FEATURE licencia1 15/03/05
FEATURE licencia2 15/03/06
FEATURE licencia3 15/03/05
FEATURE licencia4 15/03/05
FEATURE licencia5 15/03/05
FEATURE licencia6 15/03/05
FEATURE licencia7 15/03/05
FEATURE licencia8 15/03/05
FEATURE licencia9 15/03/05
FEATURE licencia10 15/03/05

Entonces tengo que buscar del fichero de configuración en el fichero de licencias. Una vez que encuentre tengo que comparar si es esa e imprimirla.

Para esto ya llevo un adelanto con el hash sólo que tampoco puedo recorrer el hash completamente y empezar con lo demás.

Este es mi código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
######################
#!/usr/bin/env perl
#######################
#Definicion de variables
#######################
my $f_Archivo_de_Entrada = "/export/home/sistemas/nolvera/perl/expresiones/lic.dat";
my $f_Archivo_de_Entrada2 = " /export/home/sistemas/nolvera/perl/expresiones/licencias.cfg";
my $f_Archivo_de_Salida  = "/export/home/sistemas/nolvera/perl/expresiones/salida/SHCP";
my $f_Archivo_de_salida2 = "/export/home/sistemas/nolvera/perl/expresiones/salida/BANXICO";
my  @a_Nodo = qw (1 2);
my $b_Bandera = 0;
%s_cliente1;
%s_cliente2;
$s_Nodo;
######################
#Abrir archivo
######################
open IN, "$f_Archivo_de_Entrada2";
while (<IN>){
              my $s_Linea1 = $_;
              chomp $s_Linea1;
              my @a_Lineas1 = split ',', $s_Linea1;
              $s_Nodo = $a_Lineas1[0];
              #$s_cliente1{$a_Lineas1[0]}{$a_Lineas1[1]}=$a_Lineas1[1];
              #$s_cliente1{$a_Lineas1[0]}{$a_Lineas1[2]}=$a_Lineas1[2];
              #$s_cliente1{$a_Lineas1[0]}{$a_Lineas1[3]}=$a_Lineas1[3];
              #$s_cliente1{$a_Lineas1[0]}{$a_Lineas1[4]}=$a_Lineas1[4];


              $s_cliente1{$s_Nodo}= $a_Lineas1[4];
              my $i_Cont = 0;
              for ( $i_Cont = 1; $i_Cont<@a_Lineas1; $i_Cont++) {
                          $s_cliente1{$s_Nodo}{$a_Lineas1[$i_Cont]} = "";
                                                                }
             }
              foreach my $s_valor ( keys %s_cliente1){
                       $s_texto = ~ m/$s_cliente1{$s_}/g;
                      my $s_valor1 = $s_cliente1{$s_valor};
                      print "$s_valor1 .\n";
                                                     }

close IN;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
nany
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2006-12-11 13:36 @608

Notapor explorer » 2007-03-02 20:04 @878

nany escribiste:Entonces tengo que buscar del fichero de configuración en el fichero de licencias. Una vez que encuentre tengo que comparar si es esa e imprimirla.
A ver... dices que el fichero de configuración tiene la lista de licencias a buscar en el segundo fichero, pero ¿qué quieres decir con comparar? ¿Quieres decir que se debe imprimir la línea entera del segundo fichero?

¿Para qué sirve @a_Nodo? ¿y $b_Bandera? ¿y $s_Nodo?

Veo que haces un split sobre la línea leída del fichero de configuración y lo guardas en el array @a_Lineas1, pero... unas líneas más abajo haces referencia a $a_Lineas1[4] y yo no veo que el fichero de configuración tenga más de 4 campos. ¿A qué quieres referirte con ese 4?

Si el problema se reduce a pintar las líneas del fichero de licencias según las indicadas por el fichero de configuración, la solución es más sencilla...

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

# Leemos el fichero de licencias, indexada por el nombre de licencia
my %licencia_de;

open LICENCIAS,    '<lic.dat'
    or die "ERROR: No puedo abrir el fichero de licencias: $!\n";

while ( <LICENCIAS> ) {
    chomp;

    # Las líneas del fichero de licencias tienen campos separados por espacios
    # Nos quedamos con el segundo campo (nombre de la licencia) y lo usamos
    # como clave
    my $nombre_de_licencia = (split " ")[1];
    $licencia_de{ $nombre_de_licencia } = $_;
}

close LICENCIAS;

# Abrir fichero de configuración
open CONFIGURACION,'<licencias.cfg'
    or die "ERROR: No puedo abrir el fichero de configuración: $!\n";

while ( <CONFIGURACION> ) {
    chomp;

    # Las líneas del fichero de configuración tienen campos separados por
    # comas. El primer campo es el nombre de la sección y los restantes son
    # los nombres de las licencias
    my @campo_de_configuracion = split q{,};

    my $nombre_de_seccion      = shift @campo_de_configuracion;

    print $nombre_de_seccion . "\n";

    # Recorremos los nombres de licencia y los sacamos en pantalla
    foreach my $licencia ( @campo_de_configuracion ) {
        print "\t" . $licencia_de{ $licencia } . "\n";
    }
}

close CONFIGURACION;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
sale:
Código: Seleccionar todo
COMISION
        FEATURE licencia1 15/03/05
        FEATURE licencia2 15/03/06
        FEATURE licencia3 15/03/05
COMISION2
        FEATURE licencia8 15/03/05
        FEATURE licencia5 15/03/05
        FEATURE licencia10 15/03/05
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 1 invitado