Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problemas con -e / -d / -f

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mie Jul 11, 2007 7:23 pm
alvgutierr
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Jul 2007
Mensajes: 16
Problemas con -e / -d / -f Responder citando

Estimados Perleros
La consulta es la siguiente ...

Perl:
$var="file/archivo.txt";
   if(-e $var){ # también escribo  if(-e "$var"){
     print "SI";
   }
  elsif(!-e $var){
       print "No ";
 }

¿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! Question Question Question
Mensaje Mie Jul 11, 2007 11:50 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Simplificando el 'if'...
Perl:
$var = "file/archivo.txt";

if( -e $var ){     # si existe el fichero $var,
    print "SI\n"# "SI"
}
else {             # si no,
    print "NO\n"# "NO"
}
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.
Mensaje Jue Jul 12, 2007 7:22 am
alvgutierr
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Jul 2007
Mensajes: 16
Problema -e /-d /- f Responder citando

Estimado explorer, agradezco tu respuesta
Pero el problema es el siguiente: en este fragmento de código es donde ocurre el problema
Perl:
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";
}

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!
Mensaje Jue Jul 12, 2007 8:11 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Cambia la línea
Perl:
elsif ( !-e $salida ) {
por
Perl:
else {
Si aún así el programa no encuentra el fichero, es que ese fichero no está en el sistema.
Mensaje Jue Jul 12, 2007 10:27 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Perl:
elsif(!-e $var){


¿elsif existe?, no sabía que es igual a else... Question
Mensaje Jue Jul 12, 2007 11:41 am
alvgutierr
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Jul 2007
Mensajes: 16
¡Solución! Responder citando

¡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ó!

Perl:
$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;
}

¡Gracias Explorer, por tu ayuda!
Smile Smile Smile Smile Smile
Mensaje Jue Jul 12, 2007 1:55 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola:

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

Perl:
$string =~ s/^\s*//;


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

Perl:
$string =~ s/^\s+//;


¿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:

Perl:
$string =~ s/^\s*(.*?)\s*$/$1/;


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

Perl:
$string =~ s/\s+//g;


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
Mensaje Jue Jul 12, 2007 2:06 pm
alvgutierr
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Jul 2007
Mensajes: 16
Responder citando

Gracias kidd
Lo voy a cambiar ¡y chequeo el resultado!
Mensaje Jue Jul 12, 2007 6:08 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Kiloko escribió:
Perl:
elsif(!-e $var){


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

Y no es equivalente a else, sino a un "else if", es decir:
Perl:
elsif ( ! -e $var ) {
es equivalente a
Perl:
else if ( ! -e $var ) {
.

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.
Mensaje Lun Jul 16, 2007 5:47 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

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?
Mensaje Lun Jul 16, 2007 5:50 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Perdón, sería:
Un elsif se pone después de un if y si éste se cumple no termina con el else, si no que elsif da la posibilidad de otro if.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group