Página 1 de 2

Open or die

NotaPublicado: 2016-10-16 14:46 @657
por jairo15
Al poner en mi código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open(...) or die("No se pudo abrir el archivo < archivo.txt, $!");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
simplemente se cierra si quito el archivo de la carpeta.
Y cuando solo pongo $! en die es lo mismo. También he intentado poner || en lugar de 'or', pero da igual.

No sé si esa sea la estructura correcta. Estoy usando ActivePerl 5.20.

Re: Open or die

NotaPublicado: 2016-10-16 15:01 @667
por explorer
¿Y qué es lo que quieres hacer, o qué es lo que quieres que pase?

Estás diciendo que abra el archivo, o que se muera el programa.

Re: Open or die

NotaPublicado: 2016-10-16 15:03 @669
por jairo15
Lo que quiero es que imprima el mensaje de que no se pudo abrir.

Re: Open or die

NotaPublicado: 2016-10-16 15:22 @682
por explorer
En ese caso, cambia die() por warn().

warn() emite un mensaje por la salida estándar de error (que normalmente suele coincidir con la salida estándar).

Y el programa sigue en la siguiente sentencia.

Re: Open or die

NotaPublicado: 2016-10-16 15:26 @684
por jairo15
Otra duda con el sig. código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use FindBin;
  4. use lib $FindBin::Bin;
  5. use genNumeros;
  6.  
  7. my @palabra;
  8. open (my $ARCHIVO, '<', "palabras.txt")
  9.       or warn ("No se encontro el archivo palabras.txt, $!");
  10. while (my $palabra = <$ARCHIVO>) {
  11.     chomp $palabra;            
  12.  
  13.     push @palabra, $palabra;  
  14. }
  15. close $ARCHIVO;
  16. my $palabraAleatoria = $palabra[genNumeros::crearNumero()];
  17. print"$palabraAleatoria";
  18. <>;
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que se cierra solo al ejecutar el .pl, uso perl -c y perl -wc y ambos escriben: syntax OK perl -V pone al final el '.'

Código del modulo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package genNumeros;
  2. use strict;
  3. use warnings;
  4. use Math::Complex;
  5.  
  6.  
  7. my $seed = time();
  8. my $a = $seed / 5;
  9. my $c = $seed - 7;
  10. my $x = $seed;
  11. my $m = sqrt($seed % 574) + $seed;
  12. my $numAleatorio;
  13.  
  14.  
  15. sub generadorMultiplicativo{
  16.     $numAleatorio = ((($a*$x) + $c) % $m);
  17.     $x = $numAleatorio;
  18. }
  19. my $letra;
  20. my $residuo;
  21.  
  22. sub crearNumero{
  23. for my $i(1.. 1){
  24. generadorMultiplicativo();
  25.          $residuo = $x/$m;
  26.        
  27.    if($residuo < 0.0384615384615385 ){
  28.            $letra = 1;
  29.    }
  30.    if($residuo > 0.0384615384615385 && $residuo < 0.076923076923077){
  31.            $letra = 2;
  32.    }
  33.    if($residuo > 0.076923076923077 && $residuo < 0.1153846153846154){
  34.            $letra = 3;
  35.    }
  36.    if($residuo > 0.1153846153846154 && $residuo < 0.1538461538461538){
  37.            $letra = 4;
  38.    }
  39.    if($residuo > 0.1538461538461538 && $residuo < 0.1923076923076923){
  40.            $letra = 5;
  41.    }
  42.    if($residuo > 0.1923076923076923 && $residuo < 0.2307692307692308){
  43.            $letra = 6;
  44.    }
  45.    if($residuo > 0.2307692307692308 && $residuo < 0.2692307692307692){
  46.            $letra = 7;
  47.    }
  48.    if($residuo > 0.2692307692307692 && $residuo < 0.3076923076923077 ){
  49.            $letra = 8;
  50.    }
  51.    if($residuo > 0.3076923076923077 && $residuo < 0.3461538461538462){
  52.            $letra = 9;
  53.    }
  54.    if($residuo > 0.3461538461538462 && $residuo < 0.3846153846153846){
  55.            $letra = 10;
  56.    }
  57.    if($residuo > 0.3846153846153846 && $residuo < 0.4230769230769231){
  58.            $letra = 11;
  59.    }
  60.    if($residuo > 0.4230769230769231 && $residuo < 0.4615384615384615){
  61.            $letra = 12;
  62.    }
  63.    if($residuo > 0.4615384615384615 && $residuo < 0.5){
  64.            $letra = 13;
  65.    }
  66.    if($residuo > 0.4615384615384615 && $residuo < 0.5384615384615385){
  67.            $letra = 14;
  68.    }
  69.    if($residuo > 0.5384615384615385 && $residuo < 0.5769230769230769){
  70.            $letra = 15;
  71.    }
  72.    if($residuo > 0.5769230769230769 && $residuo < 0.6153846153846154){
  73.            $letra = 16;
  74.    }
  75.    if($residuo > 0.6153846153846154 && $residuo < 0.6538461538461538){
  76.            $letra = 17;
  77.    }
  78.    if($residuo > 0.6538461538461538 && $residuo < 0.6923076923076923){
  79.            $letra = 18;
  80.    }
  81.    if($residuo > 0.6923076923076923 && $residuo < 0.7307692307692308){
  82.            $letra = 19;
  83.    }
  84.    if($residuo > 0.7307692307692308 && $residuo < 0.7692307692307692){
  85.            $letra = 20;
  86.    }
  87.    if($residuo > 0.7692307692307692 && $residuo < 0.8076923076923077){
  88.            $letra = 21;
  89.    }
  90.    if($residuo > 0.8076923076923077 && $residuo < 0.8461538461538462){
  91.            $letra = 22;
  92.    }
  93.    if($residuo > 0.8461538461538462 && $residuo < 0.8846153846153846){
  94.            $letra = 23;
  95.    }
  96.    if($residuo > 0.8846153846153846 && $residuo < 0.9230769230769231){
  97.            $letra = 24;
  98.    }
  99.    if($residuo > 0.9230769230769231 && $residuo < 0.9615384615384615){
  100.            $letra = 25;
  101.    }
  102.    if($residuo > 0.9615384615384615 && $residuo < 1){
  103.                    $letra = 26;
  104.    }
  105.    
  106.      }
  107. }
  108.  
  109. 1;
  110.  
  111.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4

No cambié '$letra' por '$numero' debido a que no quiero perder tanto tiempo ya que es un copy-paste

Re: Open or die

NotaPublicado: 2016-10-17 05:42 @279
por explorer
No es posible que se cierre solo sin decir nada, ni siquiera un mensaje de error.

A mi me funciona, pero he hecho los siguientes cambios.

* He quitado el bucle for my $i (1..1), porque... no sirve para nada.

* He añadido un return $letra; al final de crearNumero(), para que se devuelva de forma correcta el número aleatorio elegido antes. Si no pones nada en una función, Perl devolverá el valor de la última instrucción ejecutada, que en tu código corresponde a la expresión booleana del último if(), o a la asignación $letra = 26, así que, en realidad, tu función solo está devolviendo dos valores: o 0 o 26. Colocando un return $letra, devolvemos el valor de la $letra calculada.

* El programa funciona si existe un archivo llamado palabras.txt, en el mismo directorio, y al menos tiene 27 palabras. Lo del 27 es porque, en la línea 16, genNumeros::crearNumero() nos devolverá un valor entre 0 y 26, incluidos (si hemos añadido el return, como se ha comentado). Si palabras.txt tiene más palabras, no serán seleccionadas nunca.

Re: Open or die

NotaPublicado: 2016-10-18 18:36 @817
por jairo15
Ya me aseguré de que el .txt tiene 27 palabras, añadí el return $letra, eliminé el for() inservible y sigue igual: se cierra solo, sin decir nada.

Re: Open or die

NotaPublicado: 2016-10-19 03:39 @194
por explorer
Este es el código que tengo, y me funciona. Hay cosas que le he tenido que poner y que le faltan a tu código, como por ejemplo, la primera línea '#!...' en el programa. Quizás para tu sistema operativo sea importante.
Sintáxis: (palabras.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
vecinos1
discolo2
caro3    
caballo4
vecinos5
discolo6
caro7    
caballo8
compra9
fruta10
pesada11
altramuz12
locura13
altramuz14
locura15
discolo16
caro17    
caballo18
compra19
fruta20
pesada21
altramuz22
locura23
altramuz24
locura25
altramuz26
locura27
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: (programa.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use FindBin;
  5. use lib "$FindBin::Bin";
  6. use genNumeros;
  7.  
  8. my @palabras;
  9.  
  10. open (my $ARCHIVO, '<', "palabras.txt")
  11.       or die ("No se encontro el archivo palabras.txt, $!");
  12. while (my $palabra = <$ARCHIVO>) {
  13.     chomp $palabra;            
  14.  
  15.     push @palabras, $palabra;  
  16. }
  17. close $ARCHIVO;
  18.  
  19. print "Leidas ", scalar(@palabras), " palabras\n";
  20.  
  21.  
  22. my $palabraAleatoria = $palabras[genNumeros::crearNumero()];
  23.  
  24. print "$palabraAleatoria\n";
  25.  
  26. <>;     # caso de Windows: esperamos la pulsación del usuario para cerrar la pantalla.
  27.         # no es necesaria en otros S.O. o si lo ejecutamos en una ventana CMD de Windows.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: (genNumeros.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. package genNumeros;
  2. use strict;
  3. use warnings;
  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.  
  13. sub generadorMultiplicativo{
  14.     $numAleatorio = ((($a*$x) + $c) % $m);
  15.  
  16.     $x = $numAleatorio;
  17. }
  18. my $letra;
  19. my $residuo;
  20.  
  21. sub crearNumero {
  22.     generadorMultiplicativo();
  23.  
  24.     $residuo = $x / $m;                         # $residuo debería tener un valor entre 0 y 1
  25.  
  26.     return int($residuo * 27);                  # devuelve un valor entre 0 y 26 (27 números diferentes)
  27. }
  28.  
  29. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por otra parte... no sé qué procedimiento estás usando para obtener el número aleatorio, pero tiene cierta preferencia por unos pocos números...

Re: Open or die

NotaPublicado: 2016-10-19 16:48 @742
por jairo15
Yo, con los cambios hechos, al ejecutar y al salir la ventana, tengo que seleccionar una parte de la ventana, para que quede abierta, luego le doy a enter e imprime la parte de las palabras leídas, y si le quito ese pedazo de código, aparece: Undefined subroutine &genNumeros::crearNumero called at .... at line 17

Re: Open or die

NotaPublicado: 2016-10-20 02:37 @151
por explorer
¡Qué cosas más raras! Es Windows, ¿verdad? ¿Qué versión?

Si no sale texto en la ventana hasta que pulsas la tecla de Entrar, quizás es que esa consola está manejando mal el búfer de salida.

Hay una forma de decirle a Perl a que no use el búfer de salida de caracteres hacia el exterior, y de esa manera, todos los textos salen de forma inmediata.

Tienes que colocar esta línea

$|=1;

en el programa, después de los 'use'.

Te recomiendo que, en Windows, arranques una ventana CMD (CMD.exe o de línea de comandos), y dentro de ella te posiciones dentro del directorio donde tienes tu programa, y lo ejecutas desde ahí, así: perl programa.pl Mira la quinta pantalla del primer mensaje de esta página.

El mensaje de error dice que has quitado la línea del 'use genNumeros' del programa.pl.