• Publicidad

Comprobar si existe un archivo en Windows

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

Comprobar si existe un archivo en Windows

Notapor pablov » 2014-01-29 21:06 @921

Hola, estimados. Primero que todo felicitarlos por esta comunidad, no la conocía porque hasta ahora no he tenido la necesidad de programar en Perl.

Bueno, comencé hoy con la programación y estoy haciéndolo orientado a objeto.

Tengo un problema con comprobar la existencia de un archivo en Perl; sé que es fácil, le pondré un ejemplo.

Estoy probando con un método que antes de inicializar el atributo archivo, confirma que exista. Esta es la prueba:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub archivo{
  2.              my $self=shift; # El primer parámetro de un método es la  clase
  3.  
  4.                 #print @_;
  5.                
  6.                 if(-e @_){
  7.                 print "Existe";
  8.                 }else{
  9.                 print "No existe";
  10.                 }
  11.        $self->{archivo}=shift if (@_);
  12.  
  13.        #Devolvemos el nombre
  14.        return $self->{archivo};
  15.          }
  16.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

y lo uso de esta forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use clases::Archivo;
  2. $archivo = Archivo->new();
  3. $archivo->archivo("C:\\Users\\ANA\\Documents\\perl\\prueba.log");
  4. print "Mi archivo es". $archivo->archivo."";
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que me imprime que el archivo no existe, sabiendo yo que sí existe. ¿Cuál es el problema con Perl en Windows?


Saludos y gracias de antemano.
pablov
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2014-01-28 19:50 @868

Publicidad

Re: Comprobar si existe un archivo en Windows

Notapor explorer » 2014-01-30 05:27 @268

Bienvenido a los foros de Perl en Español, pablov.

Perl no tiene problemas en Windows. El problema está en la forma de hacer la pregunta de si existe o no el archivo.

Tu pones if (-e @_) {.

Resulta que la función -e necesita que le pasemos como argumento el nombre del archivo que queremos que nos diga si existe o no. Es decir, un solo argumento, y resulta que le estás pasando un array, que puede contener una lista de elementos. Y esa forma de trabajar no está documentada. Probamos en la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > ls test*.tex
  2. test-out.tex  test-pdf.tex  test.tex
  3. > perl -E '@_ = qw(test.tex test-out.tex); say "Sí" if -e @_'
  4. >
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Como ves, no sale nada, y eso que sí sabemos que los archivos que hemos puesto en @_ sí existen (los hemos visto con el comando ls).

Entonces, como el archivo lo hemos pasado como argumento al método, debemos sacarlo primero de @_, y luego pasarlo a -e:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub archivo {
  2.     my $self = shift;                  # El primer parámetro de un método es el objeto de la clase
  3.  
  4.     if (@_) {                          # si aún quedan argumentos
  5.         my $archivo = shift;           # extraemos el primero como el nombre del archivo a probar
  6.  
  7.         if ( -e $archivo ) {           # ¿existe?
  8.             print "Existe";
  9.         }
  10.         else {
  11.             print "No existe";
  12.         }
  13.         $self->{archivo} = $archivo;   # guardamos el nombre del último archivo que hemos buscado
  14.     }
  15.  
  16.     return $self->{archivo};               # devolvemos el nombre del último archivo encontrado
  17. }
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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar si existe un archivo en Windows

Notapor pablov » 2014-01-30 08:45 @406

Estimado, entiendo la solución, pero tengo una consulta, resulta que me funcionó si es que le coloco "@_" al parámetro.

Coloco mi ejemplo de solución, me gustaría saber en qué podría afectar de manera negativa si no opto por la solución de ud.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. sub archivo {
  3.     my $self = shift;       # El primer parámetro de un método es la  clase
  4.  
  5.     #print @_;
  6.     if ("@_") {
  7.         if ( -e "@_" ) {
  8.             $self->{archivo} = shift if ("@_");
  9.         }
  10.         else {
  11.             print "Error!!! el archivo @_ no existe\n";
  12.             exit;
  13.         }
  14.     }
  15.  
  16.     #Devolvemos el nombre
  17.     return $self->{archivo};
  18. }
  19.  
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Actualización:

Probé tu solución y no me guarda la variable, me funciona como lo hice yo, no comprendo el porqué.
pablov
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2014-01-28 19:50 @868

Re: Comprobar si existe un archivo en Windows

Notapor explorer » 2014-01-30 11:28 @519

Te ha funcionado porque, al poner @_ entre comillas dobles, transformas el array en un escalar que contiene todos los elementos de ese array, separados por el delimitador indicado por la variable especial $" (por defecto, un espacio en blanco).

Entonces, si el array solo contiene un nombre de archivo (argumento que le pasas al método), resulta que -e ya puede realizar bien la comprobación de la existencia del archivo, ya que le estamos pasando el nombre de ese archivo (está entre comillas dobles, pero no le importa a -e).

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > ls test*.tex
  2. test-out.tex  test-pdf.tex  test.tex
  3. > perl -E '@_ = qw(test.tex test-out.tex); say "Sí" if -e "@_"'                                                      
  4. > perl -E '@_ = qw(test.tex); say "Sí" if -e "@_"'
  5. >
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ves que -e "@_" no funciona si @_ contiene más de elemento. Si contiene un solo elemento, sí.

Las consecuencias no se ven claras ahora, pero sí te dará problemas más tarde si quieres ampliar el método con más argumentos. El código no queda legible (no es muy claro que a -e se le pase un argumento).

He modificado mi código anterior para guarde el nombre del archivo en todas las ocasiones en que llamamos al método con un argumento.
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: Comprobar si existe un archivo en Windows

Notapor pablov » 2014-01-30 23:24 @017

Estimado, ahora me funciona todo ok; he seguido tu consejo; y gracias por la orientación.

Pego acá los cambios.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2.  
  3. sub archivo {
  4.     my $self =shift;
  5.     if (@_) {   # si aún quedan argumentos
  6.         my $archivo =shift;  
  7.         if ( -e $archivo ) {    # ¿existe?
  8.  
  9.             $self->{archivo} = $archivo;
  10.         }
  11.         else {
  12.             print "Error !!!! No existe el fichero $archivo";
  13.             exit;
  14.         }
  15.  
  16.     }
  17.  
  18.     return $self->{archivo};
  19. }
  20.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pablov
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2014-01-28 19:50 @868


Volver a Básico

¿Quién está conectado?

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

cron