• Publicidad

Ficheros pasados a hash

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

Ficheros pasados a hash

Notapor dacons » 2006-05-22 16:03 @710

Hola de nuevo, estoy intentando meter un fichero dentro de una lista asociativa, pero no hay forma.

El fichero tiene este formato:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Tipo: color
Precio: 3 €
Cantidad: 7 unidades
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

He hecho lo siguiente pero no funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub informe{
  2.     if (open(VAR,"fichero.txt")) {
  3.         @texto=<VAR>;
  4.     }
  5.     %lista=@texto;
  6.     print "$lista{Tipo}";
  7. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Con el vector sí va bien pero con la lista hash, no. ¿Por qué? Y una vez los he sacado ¿cómo puedo incrementarlos, por ejemplo las unidades?
dacons
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2006-02-27 04:15 @219

Publicidad

Notapor creating021 » 2006-05-22 16:55 @746

Porque al decir que %algo = @algo no se asocia, es más, debería de ser %algo = \@algo;

Pero quedaría mal, es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub informe {
  2.     if ( -x "fichero.txt" ) ) {
  3.             open( VAR, "fichero.txt" ) or die "No se pudo abrir el archivo: $!\n";
  4.             my @texto = <VAR>;
  5.             close VAR;
  6.             my %hash;
  7.             foreach my $line (@texto) {
  8.                 my @todo = split /:\s/, $line;
  9.                 $hash{"$todo[0]"} = "$todo[1]";
  10.             }
  11.     }
  12.     else {
  13.             die "El archivo \"fichero.txt\" no existe\n";
  14.     }
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2006-05-22 16:57 @748

Perl es listo, pero no tanto como para saber el formato de tu fichero.

Hay que darle un poco de ayuda...

Supongamos que tu fichero es de la estructura que muestras: Una palabra, seguida de ':' y luego del valor.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2. use strict;
  3. use warnings;
  4.  
  5. my %lista;
  6. my ( $clave, $valor );
  7.  
  8. sub informe {
  9.     open( VAR, "fichero.txt" ) or die "ERROR: No pude abrir el fichero.txt: $!\n";
  10.     while ( my $linea = <VAR> ) {
  11.         if ( ( $clave, $valor ) = $linea =~ /^(\w+):\s*(.+)\s*$/ ) {
  12.             $lista{$clave} = $valor;
  13.         }
  14.     }
  15.     close VAR;
  16. }
  17.  
  18. informe;
  19.  
  20. foreach ( keys %lista ) {
  21.     print $_, " ", $lista{$_};
  22. }
  23.  
  24. print $lista{Tipo};
  25.  
  26. $lista{Cantidad}++;
  27. print $lista{Cantidad};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

  • En la línea 10 hacemos un bucle por todo el fichero y vamos leyendo una $linea cada vez
  • En la 11, con la ayuda de la expresión regular extraemos la clave y el valor, que está separada por los ':'. Lo que hacemos es que nos quedamos con la primera (^) palabra ((\w+)), seguida de ':', posiblemente algún espacio en blanco (\s*) y nos quedamos con el resto ((.+)), menos los últimos ($) espacios en blanco (\s*)
  • De la 20 a 22, pintamos todo lo que hemos conseguido leer del fichero
  • En la 26, incrementamos el valor de Cantidad, y luego lo pintamos.
El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Cantidad 7 unidades
Precio 3 €
Tipo color
color
8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Como ves, al aumentar en uno el valor de '7 unidades', Perl lo pasa de cadena de caracteres a valor numérico. Se encuentra con el 7. Lo incrementa (8) y ese es el nuevo valor de $lista{Cantidad}. Pero NO '8 unidades'. Lo mismo le pasaría a $lista{Precio}.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ficheros pasados a hash

Notapor Perl user » 2006-05-22 17:29 @770

dacons escribiste:Hola de nuevo, estoy intentando meter un fichero dentro de una lista asociativa, pero no hay forma.

El fichero tiene este formato:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Tipo: color
Precio: 3 €
Cantidad: 7 unidades
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿Qué tal?

Te recomiendo utilizar el módulo Config::Simple o en su defecto Config::Tiny, es muy útil y puedes generar esquemas de configuración dentro del mismo archivo, échale un vistazo.

Sino, entonces una solución podría ser esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. sub parse_file {
  7.     my ( $filename ) = @_;
  8.     open my $fh, $filename or die $!;
  9.     my @output;
  10.     while ( <$fh> ) {
  11.         chomp;
  12.         push @output, split /\s*:\s*/, $_, 2;
  13.     }
  14.     close $fh;
  15.     return @output;
  16. }
  17.  
  18. my %params = parse_file( $ARGV[0] );
  19. # ya puedes utilizar %params como gustes
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor creating021 » 2006-05-22 17:50 @785

¡Oops!

Otro más:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub informe {
  2.     my $file = shift;
  3.     open FL, $file or die "Error: $!";
  4.     my @lineas = <FL>;
  5.     my %hash;
  6.     foreach my $lineas (@lineas) {
  7.         $lineas =~ s/://g;
  8.         my @todo = split / /, $lineas;
  9.         $hash{ $todo[0] } = $todo[1];  # supongo que es de tan solo dos datos.
  10.     }
  11.     return %hash;
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

:roll:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor Perl user » 2006-05-23 07:21 @348

creating021 escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub informe {
  2.     my $file = shift;
  3.     open FL, $file or die "Error: $!";
  4.     my @lineas = <FL>;
  5.     my %hash;
  6.     foreach my $lineas (@lineas) {
  7.         $lineas =~ s/://g;
  8.         my @todo = split / /, $lineas;
  9.         $hash{ $todo[0] } = $todo[1];  # supongo que es de tan solo dos datos.
  10.     }
  11.     return %hash;
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Qué tal?

Esta implementación no funciona realmente por lo siguiente:
  • Un split() sobre un espacio "vacío" literal es completamente incorrecto y no portátil; es mejor un patrón como tal
  • Si no le dices que solo quieres partir la línea en dos partes, partirá tus valores en más ( en el caso de los valores que tienen espacios en ellos )
  • Estás metiendo valores incompletos al hash gracias al punto anterior
  • Si el archivo fuera lo suficientemente grande, meterlo todo a un array pega un poco en la eficiencia del programa
  • Hay otros aspectos de estilo que hicieron falta, pero creo que con lo anterior basta para que no funcione

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor creating021 » 2006-05-23 15:10 @673

Eso es lo que pasa cuando no se usa strict :oops:

:cry: Me da pena con ustedes, pero gracias por lo dicho.

¡Ustedes son los que saben!
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor dacons » 2006-05-24 13:42 @612

Muchísimas gracias a todos, me ayudaron mucho y la explicación de explorer es buenísima.

Un saludo
dacons
Perlero nuevo
Perlero nuevo
 
Mensajes: 48
Registrado: 2006-02-27 04:15 @219


Volver a Básico

¿Quién está conectado?

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