• Publicidad

Problema con use

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

Problema con use

Notapor jairo15 » 2016-10-12 08:33 @398

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.005 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.005 segundos, usando GeSHi 1.0.8.4
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Publicidad

Re: Problema con use

Notapor explorer » 2016-10-12 08:37 @400

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con use

Notapor jairo15 » 2016-10-12 17:02 @751

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.
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Re: Problema con use

Notapor explorer » 2016-10-12 23:09 @006

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'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con use

Notapor jairo15 » 2016-10-13 12:06 @546

No, sigue igual :| ambos programas los ejecuto con perl -V y perl -c y no muestra errores.
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Re: Problema con use

Notapor explorer » 2016-10-13 14:51 @660

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con use

Notapor jairo15 » 2016-10-13 15:10 @673

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é.
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Re: Problema con use

Notapor explorer » 2016-10-13 16:03 @710

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).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con use

Notapor jairo15 » 2016-10-13 16:19 @721

Muchas gracias, el problema es que en el módulo estaba escribiendo return; en lugar de return $letra;
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602


Volver a Básico

¿Quién está conectado?

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