• 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.

Procesado de textos

Notapor yajer » 2012-05-21 11:27 @518

Hola, mi duda es si se puede escribir $line=~"$variable", o si hay alguna otra estructura para reconocer una variable en un texto.

El problema surge con este código, ya que en el archivo hay un título para cada estado y la variable $estado va cambiando.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( $INFO, "$INFO" )      || die "cannot open file $INFO: $!";
  2. open( OUT,   ">OUT.$INFO" ) || die "cannot produce file $INFO: $!";
  3.  
  4. while ( $line = <$INFO> ) {
  5.     if ( $line =~ "$estado" ) {
  6.         @list = split( /;/, $line );
  7.         foreach $element (@list) {
  8.             print OUT "$element\n";
  9.             print "$element\n";
  10.  
  11.         }
  12.     }
  13. }
  14. close($INFO);
  15. close(OUT);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


También me pregunto si en un archivo se puede reconocer un elemento de un array. Ejemplo: if($line=~"$alimento[i]") que me imprima esa línea.

Espero y agradezco sus respuestas, Un Saludo.
Última edición por explorer el 2012-05-21 11:41 @528, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
yajer
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-21 11:10 @507

Publicidad

Re: Procesado de textos

Notapor explorer » 2012-05-21 11:45 @531

Bienvenido a los foros de Perl en Español, yajer.

Puedes hacerlo con index():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $pos = index($line, $estado);
  2. if ($pos > -1) {
  3.     print "Encontrado $estado en posición $pos\n";
  4. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

O con expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($line =~ /$estado/) {
  2.     print "Encontrado $estado\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero es menos eficiente para el caso de que $estado no contenga un patrón.
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

Re: Procesado de textos

Notapor yajer » 2012-05-21 12:20 @555

Muchas gracias por tu ayuda. Ha servido de mucho.
yajer
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-21 11:10 @507

Textos, bucle y elementos de un array

Notapor yajer » 2012-05-21 12:29 @562

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "los alimentos que ha tomado son  :\n @alimentos";
  2.  
  3. $INFO = "ARCHIVO.txt";
  4.  
  5. open( $INFO, "$INFO" )      || die "cannot open file $INFO: $!";
  6. open( OUT,   ">OUT.$INFO" ) || die "cannot produce file $INFO: $!";
  7.  
  8. while ( $line = <$INFO> ) {
  9.  
  10.     for ( $i = 0; $i < $comidas; $i++ ) {
  11.         if ( $line =~ /$alimentos[$i]/ ) {
  12.             @list = split( /;/, $line );
  13.             foreach $element (@list) {
  14.                 print OUT "$element\n";
  15.                 print "$element\n";
  16.             }
  17.         }
  18.     }
  19. }
  20. close($INFO);
  21. close(OUT);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Hola de nuevo. Como podéis ver en el código tengo un array con una lista de elementos y un archivo de texto en el que cada línea comienza por la palabra de cada elemento del array, lo que quiero es que me imprima las líneas del archivo que comienzan con los elementos que estén contenidos en el array. Tras ejecutar el programa no me imprime nada y no sé por qué puede ser.

Espero vuestras respuestas, ¡un saludo!
Última edición por explorer el 2012-05-21 14:48 @658, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
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-21 14:57 @664

¿Cuánto vale $comidas?
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

Re: Textos, bucle y elementos de un array

Notapor yajer » 2012-05-21 15:01 @667

$comidas es la longitud del array y es una variable aleatoria que te pregunta antes de este programa cuando creas el array sobre cuántas comidas has realizado.
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-21 16:37 @734

Pues el caso es que a mí sí que me funciona...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. # Sacar líneas que empiecen por algún alimento
  3. # Joaquín Ferrero, 20120521
  4. use v5.12;
  5.  
  6. my @alimentos = qw<
  7.     tostadas    cafe
  8.     fresas      alubias
  9.     croquetas
  10. >;
  11.  
  12. say "Los alimentos que ha tomado son: [@alimentos]";
  13.  
  14. while (my $linea = <DATA> ) {
  15.     chomp $linea;
  16.  
  17.     for (my $i = 0; $i < @alimentos; $i++) {
  18.         if ($linea =~ /^$alimentos[$i]/) {
  19.             my @lista = split /;/, $linea;
  20.             for  my $elemento (@lista) {
  21.                 say $elemento;
  22.             }
  23.         }
  24.     }
  25. }
  26.  
  27. __DATA__
  28. croquetas;un alimento;otro alimento;postre
  29. gambas;un alimento;otro alimento;postre
  30. tallarines;un alimento;otro alimento;postre
  31. cafe;postre
  32. alubias;segundo plato
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Le añadí el '^' para buscar solo al principio de la línea.
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

Re: Textos, bucle y elementos de un array

Notapor yajer » 2012-05-21 18:34 @815

Vale, me funciona cuando introduzco el array con tu estructura pero no me funciona con ésta que es la que necesito.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Ha seleccionado usted el programa contador de calorías\n";
  2. $introduce = "introduce comida";
  3. print "introduce el numero de alimentos\n";
  4. $comidas = <STDIN>;
  5.  
  6. if ( $comidas <= 0 ) {
  7.     print "debes introducir un numero mayor que 0";
  8.     print "introduce el numero de comidas\n";
  9.     $comidas = <STDIN>;
  10. }
  11. else {
  12.     for ( $i = 0; $i < $comidas; $i++ ) {
  13.         print $introduce . ( $i + 1 ) . " \n";
  14.         $alimento = <STDIN>;
  15.         @alimentos[$i] = $alimento;
  16.     }
  17. }
  18.  
  19. print "Los alimentos que ha tomado son: @alimentos";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si me podrías aclarar esto ya sería perfecto porque no me lo explico. Un saludo y gracias de todas formas.
Última edición por explorer el 2012-05-21 18:40 @820, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
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-21 18:39 @818

Ya veo el fallo: no le quitas el retorno de carro al $alimento.

Usa chomp($alimento), después de leer el alimento del teclado.

Recuerda que cuando estás leyendo del teclado (o de un archivo de texto), el texto que lees va acompañado al final por el/los carácter/caracteres de fin de línea.

Edito: hay otro fallo menor: escribes @alimentos[$i], cuando debería ser $alimentos[$i].
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

Re: Textos, bucle y elementos de un array

Notapor yajer » 2012-05-22 03:24 @183

Perfecto, ha costado pero lo conseguí, muchas gracias por tu ayuda.

Una última duda: ahora si por ejemplo en el DATA pongo estos datos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
fruta;30
pescado;100
carne;200
leche;100
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Podría extraer esos números y sumarlos?

¡Un Saludo!
yajer
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-21 11:10 @507

Siguiente

Volver a Básico

¿Quién está conectado?

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