Mie Jul 11, 2007 7:23 pm
|
 |
alvgutierr
Perlero Nuevo

|
Registrado: 06 Jul 2007
Mensajes: 16
|
|
| Problemas con -e / -d / -f |
|
|
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!  |
|
|
|

Mie Jul 11, 2007 11:50 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Jue Jul 12, 2007 7:22 am
|
 |
alvgutierr
Perlero Nuevo

|
Registrado: 06 Jul 2007
Mensajes: 16
|
|
| Problema -e /-d /- f |
|
|
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! |
|

Jue Jul 12, 2007 10:27 am
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
¿elsif existe?, no sabía que es igual a else...  |
|
Jue Jul 12, 2007 11:41 am
|
 |
alvgutierr
Perlero Nuevo

|
Registrado: 06 Jul 2007
Mensajes: 16
|
|
| ¡Solución! |
|
|
¡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!
 |
|

Jue Jul 12, 2007 1:55 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
Hola:
Te dejo nada más un comentario acerca de las expresiones regulares que estás usando, por ejemplo:
Realmente estaría más correcto de la siguiente manera:
¿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:
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 |
|

Jue Jul 12, 2007 2:06 pm
|
 |
alvgutierr
Perlero Nuevo

|
Registrado: 06 Jul 2007
Mensajes: 16
|
|
|
|
|
Gracias kidd
Lo voy a cambiar ¡y chequeo el resultado! |
|

Jue Jul 12, 2007 6:08 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
| Kiloko escribió: |
¿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: | 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. |
|

Lun Jul 16, 2007 5:47 pm
|
 |
Kiloko
Perlero Adicto

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

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|