• Publicidad

Textos, bucle y elementos de un array

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

Re: Textos y números

Notapor explorer » 2012-05-23 14:53 @662

Pues abres el archivo (open), lo vas leyendo línea a línea, por cada línea le quitas el carácter de fin de línea (chomp), la divides separando por el carácter ';' (con split), y ya puedes ir sumando '+'. Al final del bucle, print().
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

Publicidad

Re: Textos y números

Notapor yajer » 2012-05-24 08:08 @381

Vale, tengo esto pero no me funciona.

print "Los alimentos que ha tomado son: @alimentos\n";


$CAL="ARCHIVO.txt";

open ($CAL,"$CAL")|| die"cannot open file $CAL: $!";
open (OUT, ">OUT.$CAL")|| die"cannot produce file $CAL: $!";


while (my $linea = <$CAL> ) {
chomp $linea;
$suma=0;


for (my $i = 0; $i <@alimentos; $i++) {
if ($linea =~ /^$alimentos[$i]/) {
my @lista = split /;/, $linea;
for my $elemento (@lista) {
print "$elemento\n";

chomp($elemento);
my @lista= split /;/, $linea;

for my $elemento (@lista){
$suma+=$elemento;}

print "$suma\n";


}
}

}

}
close($CAL);
close(OUT);


Consigo que me imprima los alimentos que tomaste y sus calorías al lado, pero me suma las calorías del mismo alimento dos veces en vez de las distintos alimentos. Ayuda por favor...

El archivo en el que se encuentran es un txt como este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
pescado;200
fruta;100
vodka;240
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
yajer
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-21 11:10 @507

Re: Textos, bucle y elementos de un array

Notapor explorer » 2012-05-24 09:45 @448

Es que... creo que estás liando lo que estás leyendo... Mira:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @lista = split /;/, $linea;  # $linea contiene la info. de calorias
  2. for my $elemento (@lista) {     # recorremos los campos de esa línea
  3. print "$elemento\n";
  4.  
  5. chomp($elemento);               # no es necesario porque ya se hizo chomp($linea) antes
  6. my @lista= split /;/, $linea;   # ¿Por qué dividimos cada $elemento de la $linea?
  7.  
  8. for my $elemento (@lista){      # Otro bucle... ¿de @lista? ¿@lista dentro de @lista?
  9. $suma+=$elemento;
  10. }
  11.  
  12. print "$suma\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Te aconsejo que pongas claro el nombre de cada variable, y así sabes lo que contiene.

Esta es mi versión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. # Cálculo de las calorías consumidas
  3. # Joaquín Ferrero, 20120521
  4. use utf8;
  5. use open IO => qw<:utf8 :std>;
  6. use feature qw<say>;
  7.  
  8.  
  9. say 'Ha seleccionado usted el programa contador de calorías.';
  10.  
  11. ## Leemos las comidas
  12. say 'Introduce comidas, una por línea (en blanco, para terminar):';
  13. my @comidas;
  14. while (1) {
  15.     my $comida = <>;
  16.  
  17.     chomp $comida;                      # quitar fin de línea
  18.     $comida = lc $comida;               # en minúsculas
  19.     $comida =~ s/^\s+//g;               # quitar espacios de delante
  20.     $comida =~ s/\s+$//g;               # lo mismo, de detrás
  21.     last if $comida eq '';              # si nada, terminamos bucle
  22.  
  23.     push @comidas, $comida;             # almacenamos la $comida
  24. }
  25.  
  26. ## Informar o salir
  27. exit if not @comidas;
  28. say 'Los alimentos que ha tomado son: ', join(', ', @comidas[0 .. $#comidas-1]), ' y ', $comidas[-1];
  29.  
  30. ## Leemos la tabla de alimentos
  31. my %alimentos;
  32.  
  33. #open my $CALORIAS, '<', 'calorias.txt';        # abrir el archivo o leer desde DATA
  34. #while (my $linea_calorias = <$CALORIAS>) {     # leer desde el archivo o desde DATA
  35. while (my $linea_calorias = <DATA>) {
  36.     chomp $linea_calorias;
  37.     my($alimento, $calorias) = split /;/, $linea_calorias;
  38.  
  39.     $alimentos{$alimento} = $calorias;          # almacenamos las $calorias por cada $alimento
  40. }
  41. #close $CALORIAS;
  42.  
  43. ## Cálculo de las calorías
  44. my $total_calorias = 0;
  45.  
  46. for my $comida (@comidas) {
  47.     if ($alimentos{$comida}) {
  48.         $total_calorias += $alimentos{$comida};
  49.     }
  50.     else {
  51.         say "No tengo datos para el alimento [$comida]";
  52.     }
  53. }
  54.  
  55. say "Total de calorías: $total_calorias";
  56.  
  57. __DATA__
  58. fruta;30
  59. pescado;100
  60. carne;200
  61. leche;100
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@portatil ~/Documents/Desarrollo $ perl code_31231.pl
Ha seleccionado usted el programa contador de calorías.
Introduce comidas, una por línea (en blanco, para terminar):
carne
pescado
fruta

Los alimentos que ha tomado son: carne, pescado y fruta
Total de calorías: 330
Coloreado en 0.000 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

Anterior

Volver a Básico

¿Quién está conectado?

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