• Publicidad

Open or die

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

Open or die

Notapor jairo15 » 2016-10-16 14:46 @657

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

Publicidad

Re: Open or die

Notapor explorer » 2016-10-16 15:01 @667

¿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.
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: Open or die

Notapor jairo15 » 2016-10-16 15:03 @669

Lo que quiero es que imprima el mensaje de que no se pudo abrir.
jairo15
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2016-09-11 13:27 @602

Re: Open or die

Notapor explorer » 2016-10-16 15:22 @682

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.
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: Open or die

Notapor jairo15 » 2016-10-16 15:26 @684

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

Re: Open or die

Notapor explorer » 2016-10-17 05:42 @279

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.
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: Open or die

Notapor jairo15 » 2016-10-18 18:36 @817

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

Re: Open or die

Notapor explorer » 2016-10-19 03:39 @194

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...
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: Open or die

Notapor jairo15 » 2016-10-19 16:48 @742

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

Re: Open or die

Notapor explorer » 2016-10-20 02:37 @151

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

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron