Página 1 de 1

Problema con use

NotaPublicado: 2016-10-12 08:33 @398
por jairo15
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use genLetras;
  4.  
  5. for my $i ( 1 .. 30 ) {
  6.     for my $j ( 1 .. 30 ) {
  7.         generarLetra();
  8.         $matriz[$i][$j] = $letra;
  9.     }
  10. }
  11.  
  12. for my $i ( 1 .. 30 ) {
  13.     for my $j ( 1 .. 30 ) {
  14.         print "[$matriz[$i][$j]] ";
  15.     }
  16.     print "\n";
  17. }
  18.  
  19. <>;
  20.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No me funciona el programa. Al ejecutarlo como perl -c dice que falta instalar ese módulo (genLetras.pm), el cual tengo en la misma carpeta que el ejecutable.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use Math::Complex;
  4.  
  5. my $seed = time();
  6. my $a    = $seed / 5;
  7. my $c    = $seed - 7;
  8. my $x    = $seed;
  9. my $m    = sqrt( $seed % 574 ) + $seed;
  10. my $numAleatorio;
  11.  
  12. sub generadorMultiplicativo {
  13.     $numAleatorio = ( ( ( $a * $x ) + $c ) % $m );
  14.     $x = $numAleatorio;
  15. }
  16. my $letra;
  17. my $residuo;
  18.  
  19. sub generarLetra {
  20.     for my $i ( 1 .. 30 ) {
  21.         generadorMultiplicativo();
  22.         $residuo = $x / $m;
  23.  
  24.         if ( $residuo < 0.0384615384615385 ) {
  25.             $letra = 'A';
  26.         }
  27.         if ( $residuo > 0.0384615384615385 && $residuo < 0.076923076923077 ) {
  28.             $letra = 'B';
  29.         }
  30.         if ( $residuo > 0.076923076923077 && $residuo < 0.1153846153846154 ) {
  31.             $letra = 'C';
  32.         }
  33.         if ( $residuo > 0.1153846153846154 && $residuo < 0.1538461538461538 ) {
  34.             $letra = 'D';
  35.         }
  36.         if ( $residuo > 0.1538461538461538 && $residuo < 0.1923076923076923 ) {
  37.             $letra = 'E';
  38.         }
  39.         if ( $residuo > 0.1923076923076923 && $residuo < 0.2307692307692308 ) {
  40.             $letra = 'F';
  41.         }
  42.         if ( $residuo > 0.2307692307692308 && $residuo < 0.2692307692307692 ) {
  43.             $letra = 'G';
  44.         }
  45.         if ( $residuo > 0.2692307692307692 && $residuo < 0.3076923076923077 ) {
  46.             $letra = 'H';
  47.         }
  48.         if ( $residuo > 0.3076923076923077 && $residuo < 0.3461538461538462 ) {
  49.             $letra = 'I';
  50.         }
  51.         if ( $residuo > 0.3461538461538462 && $residuo < 0.3846153846153846 ) {
  52.             $letra = 'J';
  53.         }
  54.         if ( $residuo > 0.3846153846153846 && $residuo < 0.4230769230769231 ) {
  55.             $letra = 'K';
  56.         }
  57.         if ( $residuo > 0.4230769230769231 && $residuo < 0.4615384615384615 ) {
  58.             $letra = 'L';
  59.         }
  60.         if ( $residuo > 0.4615384615384615 && $residuo < 0.5 ) {
  61.             $letra = 'M';
  62.         }
  63.         if ( $residuo > 0.4615384615384615 && $residuo < 0.5384615384615385 ) {
  64.             $letra = 'N';
  65.         }
  66.         if ( $residuo > 0.5384615384615385 && $residuo < 0.5769230769230769 ) {
  67.             $letra = 'O';
  68.         }
  69.         if ( $residuo > 0.5769230769230769 && $residuo < 0.6153846153846154 ) {
  70.             $letra = 'P';
  71.         }
  72.         if ( $residuo > 0.6153846153846154 && $residuo < 0.6538461538461538 ) {
  73.             $letra = 'Q';
  74.         }
  75.         if ( $residuo > 0.6538461538461538 && $residuo < 0.6923076923076923 ) {
  76.             $letra = 'R';
  77.         }
  78.         if ( $residuo > 0.6923076923076923 && $residuo < 0.7307692307692308 ) {
  79.             $letra = 'S';
  80.         }
  81.         if ( $residuo > 0.7307692307692308 && $residuo < 0.7692307692307692 ) {
  82.             $letra = 'T';
  83.         }
  84.         if ( $residuo > 0.7692307692307692 && $residuo < 0.8076923076923077 ) {
  85.             $letra = 'U';
  86.         }
  87.         if ( $residuo > 0.8076923076923077 && $residuo < 0.8461538461538462 ) {
  88.             $letra = 'V';
  89.         }
  90.         if ( $residuo > 0.8461538461538462 && $residuo < 0.8846153846153846 ) {
  91.             $letra = 'W';
  92.         }
  93.         if ( $residuo > 0.8846153846153846 && $residuo < 0.9230769230769231 ) {
  94.             $letra = 'X';
  95.         }
  96.         if ( $residuo > 0.9230769230769231 && $residuo < 0.9615384615384615 ) {
  97.             $letra = 'Y';
  98.         }
  99.         if ( $residuo > 0.9615384615384615 && $residuo < 1 ) {
  100.             $letra = 'Z';
  101.         }
  102.  
  103.     }
  104. }
  105.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: Problema con use

NotaPublicado: 2016-10-12 08:37 @400
por explorer
Cambia la línea 10 a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                         genLetras::generarLetra();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Humm...

Si el error dice que no encuentra el módulo, que estará al mismo nivel que el programa, es posible que @INC no tenga preinstalado la ruta actual como ruta a buscar.

Ejecuta

perl -V

y nos copias la última parte, la que dice @INC, y siguientes líneas. Si la última línea es un '.', entonces es que está bien.

Otra cosa... la subrutina generarLetra(), realmente no devuelve nada. No hay un return. Y la variable $letra que está en el programa principal no tiene nada que ver con la $letra que está en el módulo (está declarada con my()).

Casi mejor si generarLetra() termina con un return, y cambias las líneas 10 y 11 del programa por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                         $matriz[$i][$j] = genLetras::generarLetra();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra cosa más. El montón de líneas que hay en generarLetra() se puede reducir a:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub generarLetra {
  2.     my @letras = 'A'..'Z';
  3.  
  4.     for my $i ( 1 .. 30 ) {             # no sabemos por qué está este bucle
  5.         generadorMultiplicativo();
  6.  
  7.         $residuo = $x / $m;
  8.  
  9.         $letra = $letras[ $residuo * @letras ];
  10.     }
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Problema con use

NotaPublicado: 2016-10-12 17:02 @751
por jairo15
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
@INC:
    C:/Perl64/site/lib
    C:/Perl64/lib
    .
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sigue estando igual.
Ya le añadí el return.

Re: Problema con use

NotaPublicado: 2016-10-12 23:09 @006
por explorer
Pues es muy raro. La presencia del '.' indica que va a buscar el módulo en el mismo directorio donde se encuentre el programa.

Comprueba que se llama genLetras.pm (respetando las mayúsculas y minúsculas, que es importante).

Si está bien, prueba a añadir arriba

use lib 'directorio-donde-está-mi-módulo';

antes de tu 'use'.

Re: Problema con use

NotaPublicado: 2016-10-13 12:06 @546
por jairo15
No, sigue igual :| ambos programas los ejecuto con perl -V y perl -c y no muestra errores.

Re: Problema con use

NotaPublicado: 2016-10-13 14:51 @660
por explorer
Hummm... vamos a descontar cosas obvias...

Un módulo debe terminar con un valor positivo.

Asegúrate que hay un

1;

al final del módulo.

Re: Problema con use

NotaPublicado: 2016-10-13 15:10 @673
por jairo15
Gracias por la ayuda, ese problema quedó resuelto, pero con el siguiente código imprime

use f unintialized value in concatenation (.) or string at line 18:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
  2. use FindBin;
  3. use lib $FindBin::Bin;
  4. use GenLetras;
  5. my @matriz;
  6.  
  7.  
  8.  
  9. for my $k (1 .. 30 ) {
  10.             for my $j (1 .. 30 ) {
  11.                         GenLetras::generarLetra();
  12.                         $matriz[$k][$j] = GenLetras::generarLetra();
  13.        }
  14.  }
  15.  
  16. for  $k (1 .. 30 ) {
  17.             for  $j (1 .. 30 ) {
  18.                          print "$matriz[$k][$j] ";
  19.     }
  20.     print "\n";
  21. }
  22.  
  23. <>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sé que es porque no se le está ingresando valores a la matriz, y no sé por qué.

Re: Problema con use

NotaPublicado: 2016-10-13 16:03 @710
por explorer
Seguramente porque GenLetras::generarLetra() no está devolviendo nada.

(¿Y por qué lo llamas dos veces?)

¿Pusiste un return con el valor que quieres devolver dentro de generarLetra()?

Más información en tu propio ordenador en perldoc perlsub, y en la Web (traducido al español).

Más información en tu propio ordenador en perldoc perlmod, y en la Web (traducido al español). (Ir a la sección Módulos Perl).

Re: Problema con use

NotaPublicado: 2016-10-13 16:19 @721
por jairo15
Muchas gracias, el problema es que en el módulo estaba escribiendo return; en lugar de return $letra;