• Publicidad

Bucle de control de errores

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

Bucle de control de errores

Notapor Arianss90 » 2016-09-08 05:25 @267

Hola, estoy intentado abrir un archivo para escribir en él y me gustaría hacer el código para que no pare de preguntar al usuario hasta que el archivo esté abierto y creado correctamente.

En otras ocasiones esta estructura me ha funcionado pero no sé por qué no lo está haciendo en esta ocasión. ¿Cómo podría arreglarlo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dest, my $fh, my $w=0;
  2. while ($w == 0) {
  3.         print "Please, enter the destination path to locate the Report (do not forget to add the file name and extension):\n";
  4.         $dest=<STDIN>;
  5.         chomp($dest);
  6.         if (open($fh, ">>", $dest)){
  7.                 open($fh, ">>", $dest);
  8.                 $w=1;
  9.         }
  10.         else {
  11.                 print "Wrong path, please enter the path and the file name again."
  12.         }
  13.  }
  14.         print $fh "HA FUNCIONADO!!!";
  15.         close ($fh);
  16.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Muchas gracias de ante mano.

¡Saludos!
Arianss90
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2016-08-31 05:25 @267

Publicidad

Re: Bucle de control de errores

Notapor explorer » 2016-09-08 09:09 @422

El problema que veo es que abres el archivos DOS veces: una en el if() y otra dentro del if(). Si el archivo tiene permiso de escritura lo estarás abriendo, de forma efectiva, dos veces.

Yo casi preguntaría al sistema si el archivo tiene el permiso de escritura, y listo. Algo así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $nombre_archivo_destino;
  2. my $FH;
  3.  
  4. while (not defined $FH) {
  5.  
  6.     print "Please, enter the destination path to locate the Report (do not forget to add the file name and extension):\n";
  7.     $nombre_archivo_destino = <STDIN>;
  8.     chomp $nombre_archivo_destino;
  9.  
  10.     if (-e $nombre_archivo_destino and -w _) {                  # si el archivo existe y se puede escribir en él
  11.         open $FH, ">>", $nombre_archivo_destino;                # lo abrimos en modo añadir
  12.     }
  13.     else {
  14.         print "Wrong path, please enter the path and the file name again.\n";
  15.     }
  16. }
  17.  
  18. print $FH "¡¡¡HA FUNCIONADO!!!\n";
  19.  
  20. close $FH;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Tienes más información sobre los test '-X' con perldoc -f -X

El '_' equivale a $nombre_archivo_destino, pero así nos ahorramos volver a preguntar al sistema otra vez, por los permisos del archivo. En el mismo perldoc -f -X te lo explica también.

Lo que también puedes hacer... quitar tu segundo open() ;)
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: Bucle de control de errores

Notapor Arianss90 » 2016-09-08 10:42 @487

¡Muchas gracias por contestar!

He cambiado mi código como me indicas y ahora no sale nunca del bucle y por lo tanto no crea el archivo, le meta lo que le meta siempre va al else. ¿En que estoy fallando?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dest, my $fh;
  2. while (not defined $fh){
  3. print "Please, enter the destination path to locate the Report (do not forget to add the file name and extension):\n";
  4.         $dest=<STDIN>;
  5.         chomp($dest);
  6.         if (-e $dest and -w _){
  7.                 open $fh, ">>", $dest;
  8.         }
  9.         else {
  10.                 print "Wrong path, please enter the path and the file name again.\n\n"
  11.         }
  12. }
  13.  print $fh "¡¡¡HA FUNCIONADO!!!\n";
  14.  close $fh;
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Gracias de nuevo!
Arianss90
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2016-08-31 05:25 @267

Re: Bucle de control de errores

Notapor explorer » 2016-09-08 16:18 @721

Si está en un bucle infinito, es que el archivo que metes por el teclado no existe (el test -e falla).

Yo he supuesto... que querías escribir en un archivo que ya existía. Pero a lo peor lo entendí mal, y lo que querías hacer es que querías escribir en un nuevo archivo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $nombre_archivo_destino;
  4. my $FH;
  5.  
  6. while (not defined $FH) {
  7.  
  8.     print "Please, enter the destination path to locate the Report (do not forget to add the file name and extension):\n";
  9.     $nombre_archivo_destino = <STDIN>;
  10.     chomp $nombre_archivo_destino;
  11.  
  12.     open $FH, ">>", $nombre_archivo_destino
  13.         or do {
  14.             print "ERROR al abrir el archivo: $!\n";
  15.             undef $FH;
  16.         };
  17. }
  18.  
  19. print $FH "¡¡¡HA FUNCIONADO!!!\n";
  20.  
  21. close $FH;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, ejecutamos el open(), pero si falla, sacamos un mensaje, e indefinimos $FH para repetir el bucle, hasta que pueda conseguirlo.
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: Bucle de control de errores

Notapor Arianss90 » 2016-09-09 04:33 @231

¡Mil gracias de nuevo por responderme!

He cambiado el código como me indicas y ahora si introduzco un directorio incorrecto, pero con formato de directorio sí que funciona y me pide volver a introducir el directorio (Ej. C:\Users\asanz\Desop\Report\Report.txt , Desop en vez de Desktop).

Pero si introduzco simplemente basura (Ej. aoijfepoaijfpoqjie) sale del while y pasa a la siguiente instrucción.
¿Por qué ocurre esto? ¿Alguna forma para solucionarlo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Mensajes impresos por pantalla:

Please, enter the destination path to locate the Report (do not forget to add the file name and extension):
C:\Users\asanz\Desop\Report\Report.txt
Wrong path, please enter the path and the file name again.

Please, enter the destination path to locate the Report (do not forget to add the file name and extension):
dasfwehe
Please, enter the file 1 path (do not forget to enter also the file type):
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¡¡¡Muchas gracias!!!
Arianss90
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2016-08-31 05:25 @267

Re: Bucle de control de errores

Notapor explorer » 2016-09-09 11:51 @535

Si metes basura... depende de cómo sea esa basura ;)

Por ejemplo, 'aoijfepoaijfpoqjie' es completamente válido, como nombre de archivo. El open() intenta abrir/crear un archivo así, y como respeta las reglas del sistema de archivos, lo consigue, y termina.

Pero, si metes cosas como esta: 'djfhkj\jhkjhdkhf\hjdkfhdkshf' no funcionará, por la presencia del cáracter '\'. open() le pedirá al sistema de archivos que localice la carpeta 'djfhkj', y dentro de ella, otra carpeta 'jhkjhdkhf', y finalmente, crear dentro de ella el archivo 'hjdkfhdkshf'. Y como es muy, muy posible, que esa ruta no exista, por eso falla.

Lo importante es saber exactamente que quieres conseguir. Solo sabemos que le pides una ruta/archivo al usuario, y que luego lo quieres abrir en modo agregar, pero lo que no sabemos es si es obligatorio que el archivo exista antes o no.
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: Bucle de control de errores

Notapor Arianss90 » 2016-09-12 08:37 @400

¡Gracias de nuevo por contestar otra vez!

Finalmente ya lo arreglé. La idea es que el archivo no exista, que se cree en el momento.

A raíz del comentario he pensado en una solución para abrir el archivo en caso de que haya el carácter '\' en la cadena recogida del teclado. ¡Lo dejo aquí por si alguien lo necesita alguna vez!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( not defined $fh ) {
  2.  
  3.     print "\nPlease, enter the destination path to locate the Report (do not forget to add the file name and extension):\n";
  4.     $dest = <STDIN>;
  5.     chomp($dest);
  6.     if ( $dest =~ /\\/ ) {
  7.         open( $fh, ">>", $dest )
  8.             or do {
  9.             print "Wrong path, please enter the path and the file name again.\n\n";
  10.             undef $fh;
  11.             }
  12.     }
  13.     else {
  14.         print "Wrong path structure (\\ not found), please enter the path and the file name again.\n\n";
  15.         undef $fh;
  16.     }
  17. }
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Muchísimas gracias por todo.
Arianss90
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2016-08-31 05:25 @267


Volver a Básico

¿Quién está conectado?

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

cron