El problema es que los programas de ordenador pueden ser ejecutados en un directorio distinto de donde residen. Y trabajar en un tercer directorio.
Repito: en la ejecución de un programa hay que tener en cuenta
- Dónde reside
- Desde dónde lo estamos ejecutando
- Dónde está trabajando.
El dónde reside lo tenemos claro. Es donde está grabado en el disco. Por ejemplo:
C:\Users\Administrator\Desktop\Buscador1.plEl dónde lo estamos ejecutando es el directorio desde donde lanzamos. Por ejemplo, podemos estar en
C:\ y desde allí lanzarlo con
C:\Perl64\bin\perl.exe C:\Users\Administrator\Desktop\Buscador1.pl. Mientras esté funcionando el programa,
seguiremos estando en
C:\. No nos hemos desplazado a
C:\Users\Administrator\Desktop\Buscador1.pl.
Y el lugar donde estamos trabajando es el directorio donde, en cada momento, el programa ha decidido entrar para trabajar con los ficheros que allí mismo están.
Importante: cuando arranca el programa, el directorio de trabajo es el directorio desde donde lo hemos lanzado.
Dentro de un programa, cuando está funcionando, podemos referirnos a un fichero de dos formas distintas:
* De forma absoluta. Si la trayectoria al fichero empieza con '/' (en sistemas UNIX y Windows) o con '\' o 'C:\' (en sistemas Windows) le estamos dando una trayectoria absoluta al fichero. Ejemplo:
C:\Users\Administrator\Desktop\Datos.txt* De forma relativa. Es cuando no indicamos la trayectoria completa al fichero. Puede ser un nombre de fichero solo: 'Datos.txt', con lo que nos estamos refiriendo a un fichero llamado 'Datos.txt' que resida en el directorio de trabajo del programa. También puede ser con una trayectoria relativa: '../Datos.txt' nos refiere a un fichero que está en un nivel superior a donde estamos trabajando.
Este último punto es importante: si indicamos el acceso al fichero de forma relativa, lo estamos haciendo respecto del directorio de trabajo.
Ejemplo: supongamos que tenemos un programa llamado kk.pl en
C:/Documentos/Desarrollo/. Abrimos una ventana de línea de comandos y nos situamos en
C:/Documentos. Tenemos dos formas básicas de arrancarlo:
perl C:/Documentos/Desarrollo/kk.pl
perl ./Desarrollo/kk.plEl programa es este:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Cwd;
print "Trabajo: ", cwd, "\n";
print "Actual: ", $ENV{PWD}, "\n";
if (open KK, "<kk.pl") {
print "Sí que lo encuentro.\n";
close KK;
}
else {
warn "No encuentro a kk.pl";
}
chdir 'Desarrollo';
print "Trabajo: ", cwd, "\n";
print "Actual: ", $ENV{PWD}, "\n";
if (open KK, "<kk.pl") {
print "Sí que lo encuentro.\n";
close KK;
}
else {
warn "No encuentro a kk.pl";
}
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y la salida es
Using text Syntax Highlighting
Trabajo: /home/explorer/Documents
Actual: /home/explorer/Documents
No encuentro a kk.pl at ./Desarrollo/kk.pl line 16.
Trabajo: /home/explorer/Documents/Desarrollo
Actual: /home/explorer/Documents
Sí que lo encuentro.
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
(El módulo Cwd nos devuelve el directorio de trabajo en ese momento)
Observamos que el primer intento falla: el programa no es capaz de encontrarse a sí mismo. Es debido a que el programa reside dentro del directorio Desarrollo, pero en el primer intento vemos que seguimos estando en el directorio desde donde lo hemos lanzado. Después, con la ayuda de chdir() entramos en el directorio Desarrollo y ya le encontramos. Y vemos que ahora el directorio de trabajo ya es distinto del directorio de donde partíamos.
Naturalmente, también podríamos habernos referido al fichero sin tener que desplazarnos al lugar donde está. Así:
open KK, "<./Desarrollo/kk.pl"
open KK, "<Desarrollo/kk.pl"Las dos son formas válidas para referirnos de forma relativa a la posición donde se encuentra el fichero.
La recomendación es usar dos formas básicas para trabajar con ficheros:
* Al principio del programa, hacer un chdir() para entrar en el directorio donde están los ficheros. Si chdir() falla es que no existe ese directorio, y terminamos con error. Si no hay error, podemos referirnos a los ficheros sin indicar trayectoria ninguna. Ejemplo:
Using perl Syntax Highlighting
chdir 'C:/Users/Administrator/Desktop';
open D
,'Datos.txt' or die "ERROR: No pude abrir el fichero Datos.txt: $!\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
* Nos referimos siempre a los ficheros de forma absoluta, si no estamos seguros de que el programa se lanza siempre desde el mismo sitio. O relativa, de lo contraria. Ejemplo:
Using perl Syntax Highlighting
# En Windows se puede indicar el directorio de trabajo de los programas que lanzamos
# con doble clic o por medio de Tareas programadas o Servicios Windows. Suponemos que
# indicamos que Buscador1.pl tendrá como directorio de trabajo C:/Users/Administrator/Desktop
open D
,'Datos.txt' or die "ERROR: No pude abrir el fichero Datos.txt: $!\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En esta segunda variante también está la opción de indicar el camino absoluto al fichero (si lo conocemos, por lo que entonces nos da igual dónde se ejecute el programa y cuál sea el directorio de trabajo:
Using perl Syntax Highlighting
open D
,'C:/Users/Administrator/Desktop/Datos.txt' or die "ERROR: No pude abrir el fichero C:/Users/Administrator/Desktop/Datos.txt: $!\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
(Observar que, SIEMPRE, en las operaciones de ficheros, hay una comprobación de que hemos podido abrir el fichero. Si no, nos morimos indicando el porqué (el valor de la variable
$!)).
El elegir una forma u otra, pues depende un poco del tipo de trabajo o circunstancia. Yo suelo usar siempre la primera opción cuando los programas son muy grandes, pues en esos casos es más normal que haya que trabajar con ficheros que están en otro sitio.