• Publicidad

Valor de variable sin inicializar y argumento no es numérico

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

Valor de variable sin inicializar y argumento no es numérico

Notapor andrea » 2009-07-29 18:27 @810

Hola a todos,

Desde ya un millón de gracias por su ayuda. Les cuento: mi intención es simplemente obtener valores de frecuencia de aparición de un número que se encuentren en varios archivos y luego graficarlos. Por ejemplo, cuando TE = 1 se suma a la frecuencia de TE1, estoy trabajando con 8 TEs, de manera que al final quiero tener un gráfico de barras frecuencia versus TE1, TE2, TE3... etc. El problema es que estoy obteniendo errores de 2 tipos:

Código: Seleccionar todo
Use of uninitialized value in numeric eq (==) at histo.pl line 21.
Argument "$f1" isn't numeric in numeric lt (<) at /Library/Perl/5.8.8/GD/Graph/Data.pm line 232.


He verificado que los valores de frecuencia estén bien y el módulo para graficar ya está bien instalado y he estado todo el día tratando de entender qué hay de malo en mi código. Por favor, cualquier ayuda es bienvenida.

Acá envío el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4. use CGI ':standard';
  5. use GD::Graph::bars;
  6.  
  7. #to get the histogram frequency vs lnK or TE
  8. #Sintaxis:
  9.  
  10. open(FILE,"$ARGV[0]") || die "File not found\n";
  11. #$_=<FILE>;
  12. my @lines = <FILE>;
  13. close(FILE);
  14. my ($total_residues_analyzed) = ((`wc $ARGV[0]`)=~ /^\s*(\d+)\s*.*$/);
  15. print "total_residues_analyzed + title line= $total_residues_analyzed\n";
  16.  
  17. my $i=0;
  18. my $i1 = 0; my $i2 = 0; my $i3 = 0; my $i4 = 0; my $i5 = 0; my $i6 = 0; my $i7 = 0; my $i8 = 0; my $total = 0;
  19. foreach my $line (@lines){
  20.         my ($TE) = $line =~ /^.*?( \d )$/;
  21. if ( $TE == 1 ) {
  22.         $i1++;
  23. #print "TE=1 ;$i1 veces\n";
  24. }
  25. if ($TE== 2){
  26.         ++$i2;
  27. }
  28. if ( $TE == 3) {
  29.         $i3++;
  30. }
  31. if ($TE == 4){
  32.         $i4++;
  33. }
  34. if ($TE == 5){
  35.         $i5++;
  36. }
  37. if ($TE == 6){
  38.         $i6++;
  39. }
  40. if ($TE == 7){
  41.         $i7++;
  42. }
  43. if ($TE == 8){
  44.         $i8++;
  45. }
  46. }
  47. print "TE=1 ; $i1 veces\n";print "TE=2 ; $i2 veces\n";print "TE=3 ; $i3 veces\n";print "TE=4 ; $i4 veces\n";
  48. print "TE=5 ; $i5 veces\n";print "TE=6 ; $i6 veces\n";print "TE=7 ; $i7 veces\n";print "TE=8 ; $i8 veces\n";
  49. $total=($i1+$i2+$i3+$i4+$i5+$i6+$i7+$i8);
  50. print "total=$total\n";
  51.  
  52. my ($f1)=$i1; my ($f2)=$i2;my ($f3)=$i3;my ($f4)=$i4;my ($f5)=$i5;my ($f6)=$i6; my ($f7)=$i7;my ($f8)=$i8;
  53.  
  54.  
  55. my @freq = ('$f1','$f2','$f3','$f4','$f5','$f6','$f7','$f8');
  56. my @TE = ('1','2','3','4','5','6','7','8');
  57. my @graf = (\@TE, \@freq);
  58.  
  59. my $grafico =  GD::Graph::bars->new(500, 300);
  60.  
  61. $grafico->set(
  62. x_label => 'TE',
  63. y_label => 'Frecuencia',
  64. title => 'title',
  65. ) or warn $grafico->error;
  66.  
  67. my $imagen = $grafico->plot(\@graf) or die $grafico->error;
  68.  
  69. open (OUT, "> /Users/Andrea/histo_file.png") or die "couldn't open /Users/Andrea/histo_file.png: $!";
  70.  
  71. #print "Content-type: image/png\n\n";
  72. print OUT $imagen->png;
  73. exit;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Envío también un fragmento del tipo de archivo de entrada que estoy usando, donde la última columna corresponde a los TE:
Código: Seleccionar todo
Residue  dGprom         dHap         dHpol      TdSconf       TE
 MET 1    6934.885   -1551.679       99.356    -6600.487      1
 ARG 2    6934.885   -1551.679       99.356    -6600.487      1
 GLU 3    6934.885   -1551.679       99.356    -6600.487      1
 ILE 4    6934.885   -1551.679       99.356    -6600.487      1
 SER 5    7712.407   -1305.880    -1022.363    -8226.602      1
 GLN 6    9056.182   -1160.846    -1851.605   -10431.943      6
 LYS 7    9764.170   -1521.382    -1295.115   -10674.952      6
 ASP 8    9753.353   -1666.023     -743.023   -10185.608      6
 LEU 9    9513.667   -1590.968     -688.094   -10032.352      6
 ASN 10    9941.455   -1610.331      -93.911   -10077.921      8
 LEU 11    9902.613   -1527.827      -11.849   -10022.129      8
 ALA 12    9989.197   -1449.986       41.770   -10023.733      8
 PHE 13   10154.779   -1312.573      143.667   -10025.243      8
 GLY 14   10832.670   -1497.866      242.593   -10575.876      8
Última edición por explorer el 2009-07-29 19:44 @864, editado 2 veces en total
Razón: Ortografía, bloques de código
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728

Publicidad

Re: Valor de variable sin inicializar y argumento no es numérico

Notapor explorer » 2009-07-29 19:47 @866

¿Por qué usas el módulo CGI? ¿Es que quieres presentar tu gráfico en una página web de forma dinámica?
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: Valor de variable sin inicializar y argumento no es numérico

Notapor explorer » 2009-07-29 20:41 @903

A ver... me he bajado tu programa y el fichero de datos.

He instalado los módulos
* GD
* GD::Graph
* GD-Text-Util (que incluye a GD::Text, GD::Text::Align, GD::Text::Wrap)

He hecho unos cambios estéticos y queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use GD::Graph::bars;
  7.  
  8. my %te;
  9. my $total_residues_analyzed = 0;
  10.  
  11. ## Leemos la tabla de datos
  12. open FILE,"<$ARGV[0]" or die "No pude abrir el fichero: $!\n";
  13.  
  14. while (my $linea = <FILE>) {
  15.  
  16.     ## La última columna indica el TE de la línea
  17.     my ($TE) = $linea =~ m/(\d)$/;
  18.  
  19.     ## Si no es un número, saltamos a la siguiente línea
  20.     next if ! $TE;
  21.  
  22.     ## Llevamos la cuenta de estadísticas: sumamos uno en la
  23.     ## posición del diccionario con clave $TE
  24.     $te{$TE} ++;
  25.  
  26.     $total_residues_analyzed ++;
  27. }
  28.  
  29. close FILE;
  30.  
  31. print "Total de resíduos analizados: $total_residues_analyzed\n";
  32.  
  33.  
  34. ## Presentación
  35. my $total = 0;
  36. for my $TE (sort keys %te) {
  37.     print "TE=$TE ; $te{$TE} veces\n";
  38.     $total += $te{$TE};
  39. }
  40. print "total=$total\n";
  41.  
  42.  
  43. ## Generación de los titulares para el gráfico
  44. my @freq;
  45. my @TE = 1 .. 8;
  46. for my $TE ( @TE ) {
  47.     if ($te{$TE}) {
  48.         push @freq, $te{$TE};   # Ponemos el valor de la frecuencia
  49.     }
  50.     else {
  51.         push @freq, 0;          # o 0 si no tenemos ese valor
  52.     }
  53. }
  54.  
  55. ## Datos para el gráfico
  56. my @datos_grafico = (\@TE, \@freq);
  57.  
  58. ## Generación del gráfico
  59. my $grafico =  GD::Graph::bars->new(500, 300);
  60.  
  61. $grafico->set(
  62.     x_label => 'TE',
  63.     y_label => 'Frecuencia',
  64.     title   => 'title',
  65. ) or warn $grafico->error;
  66.  
  67. my $imagen = $grafico->plot(\@datos_grafico) or die $grafico->error;
  68.  
  69. open  OUT, ">histo_file.png" or die "No puedo crear el fichero histo_file.png: $!\n";
  70. print OUT $imagen->png;
  71. close OUT;
  72.  
  73. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

sale
Imagen

El problema que tenías es que estabas guardando en @freq los literales '$f1', '$f2', etc., por efecto de las comillas simples. No estabas guardando los valores de las frecuencias leídas. Por eso sale el mensaje de error diciendo que $f1 no es numérico. Es un literal compuesto de los caracteres '$', 'f' y '1'.

Una forma de arreglarlo en tu programa es que cambies las comillas simples por dobles. O mejor... no pongas comillas :)
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: Valor de variable sin inicializar y argumento no es numérico

Notapor andrea » 2009-07-30 12:00 @541

¡Perfecto! He modificado mi código de acuerdo a tus sugerencias y funciona muy bien, ¡¡¡gracias por tu ayuda!!! Trataré de mejorar mi estética... tu código es mucho más fácil de leer que el mio :oops:

Andrea :D
andrea
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2007-07-27 16:29 @728


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado