• Publicidad

Problemas con -e / -d / -f

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problemas con -e / -d / -f

Notapor alvgutierr » 2007-07-11 20:23 @891

Estimados Perleros
La consulta es la siguiente ...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var="file/archivo.txt";
   if(-e $var){ # también escribo  if(-e "$var"){
     print "SI";
   }
  elsif(!-e $var){
       print "No ";
 }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿Por qué a veces me resulta? ¿y Perl me dice que si es un fichero o un directorio o que realmente existe?

¿Por qué a veces NO me funciona sabiendo que la ruta o el archivo realmente existe?

¿Cómo debo ocupar -e / -f / -d para no tener estos problemas?

¡Agradezco su opinión! :?: :?: :?:
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Publicidad

Notapor explorer » 2007-07-12 00:50 @076

Simplificando el 'if'...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var = "file/archivo.txt";

if( -e $var ){     # si existe el fichero $var,
    print "SI\n";  # "SI"
}
else {             # si no,
    print "NO\n";  # "NO"
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
He agregado los finales de línea '\n', para asegurarnos de que vemos en pantalla el resultado correcto en una línea separada. Puede parecer una tontería, pero hay que recordar que la salida normalmente está cacheada y Perl no vaciará el buffer de salida hasta que no tenga que pintar un final de línea o hubieses activado la variable especial $|. Es posible que a ti no te funcione en ocasiones porque el programa termine antes de que ocurra ese vaciado o que la línea sea sobreescrita por las siguientes y no seamos capaces de verla tan rápido.
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

Problema -e /-d /- f

Notapor alvgutierr » 2007-07-12 08:22 @390

Estimado explorer, agradezco tu respuesta
Pero el problema es el siguiente: en este fragmento de código es donde ocurre el problema
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( -e $salida ) {
    if( $token ne undef ) {
        &leer::recorrerServer( $salida, $token );
    }
    else {
        print "Token inválido\n";
        exit();
    }
}
elsif ( !-e $salida ) {
    print "No existe el archivo $salida. Ejecute la opción -f.\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Importante: la variable $salida está puesta de la siguiente forma: $salida="/ruta/file";

Cuando lo pruebo en mi máquina local me funciona sin problema pero al momento de mover el script a otra máquina me sucede que salta al elsif y no corre normalmente...
¿Es ese el problema?
No entiendo por qué en mi máquina si funciona y cuando muevo el script a otra máquina no?
¿Están mal escritos los if?

De ante mano, ¡Explorer, Gracias!
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Notapor explorer » 2007-07-12 09:11 @424

Cambia la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
elsif ( !-e $salida ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
else {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Si aún así el programa no encuentra el fichero, es que ese fichero no está en el sistema.
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

Notapor Kiloko » 2007-07-12 11:27 @518

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
elsif(!-e $var){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿elsif existe?, no sabía que es igual a else... :?:
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

¡Solución!

Notapor alvgutierr » 2007-07-12 12:41 @570

¡Solución al problema!

El problema era que de algún modo la variable $var contenía ¡¡espacios blancos!!
y por eso al hacer un -e /- f / -d encontraba que ¡¡no era un fichero o path válido!!
Bueno, con la función trim() que borra esos espacios ¡se solucionó!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$var = "file/archivo.txt";

sub trim {
                my ($string,$t) =@_;
                        if($t eq "l"){ 
                                $string=~s/^\s*//;#quita espacios iniciales
                        }
                        elsif($t eq "r"){
                                $string=~s/\s*$//;#quita espacios finales
                        }
                        elsif($t eq "t"){
                                $string==~s/^\s*(.*?)\s*$/$1/;#quita espacios en blanco
                        }
                return $string;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¡Gracias Explorer, por tu ayuda!
:) :) :) :) :)
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Notapor kidd » 2007-07-12 14:55 @663

Hola:

Te dejo nada más un comentario acerca de las expresiones regulares que estás usando, por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$string =~ s/^\s*//;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Realmente estaría más correcto de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$string =~ s/^\s+//;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Por qué? Debido a que el \s* le dice a la máquina de regexp que coincida con cualquier espacio que esté 0 o más veces, y pues si no hay espacios ¿cuál es el sentido de la sustitución?

Sin embargo con el \s+ solamente coincide cuando hay uno o más espacios, que es justamente lo que queremos. Lo mismo es cierto con la expresión usada para quitar espacios al final.

Luego tenemos la siguiente expresión:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$string =~ s/^\s*(.*?)\s*$/$1/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es bastante redundante y la podríamos hacer de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$string =~ s/\s+//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con el modificador g obligamos a la máquina de regexp a hacer la mayor cantidad de coincidencias posibles, por lo tanto, buscará todos los espacios y los eliminará.

Estos son solamente algunos tips para optimizar lo más posible el código.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor alvgutierr » 2007-07-12 15:06 @671

Gracias kidd
Lo voy a cambiar ¡y chequeo el resultado!
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Notapor explorer » 2007-07-12 19:08 @839

Kiloko escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
elsif(!-e $var){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿elsif existe?, no sabía que es igual a else... :?:
Pues claro que existe elsif.

Y no es equivalente a else, sino a un "else if", es decir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
elsif ( ! -e $var ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es equivalente a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
else if ( ! -e $var ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
.

Si le he pedido que cambiara el elsif por el else es porque no es necesario en su código: en el primer if está preguntando si existe el fichero $var. En caso de ser así, se ejecuta la primera parte del if. Si no existe, Perl se va a buscar el primer else, y allí se encuentra el elsif, que es lo mismo que un else if. Allí hace otra pregunta: "¿el fichero $var no existe?". Bueno, pues es obvio que esa pregunta sobra porque si Perl llega allí es porque ha fallado el primer if y por lo tanto el fichero $var no existe. Por eso sobra.
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

Notapor Kiloko » 2007-07-16 18:47 @824

Ok. Nada mas, para recapitular, ¿elsif primero pregunta si else y después if si, para la condición?

¿Algo así como si si existe o no, si existe pasa, si no pasa un if?
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado