2012-03-01 20 views
6

Tengo un script perl que utiliza rutas de archivos relativas.rutas relativas de archivos en Perl

Las rutas relativas parecen ser relativas a la ubicación desde la que se ejecuta el script en lugar de la ubicación del script de Perl. ¿Cómo puedo hacer mis rutas relativas relativas a la ubicación del script?

Por ejemplo que tienen una estructura de directorios

dataFileToRead.txt 
->bin 
    myPerlScript.pl 
->output 

dentro del script de perl abro dataFileToRead.txt utilizando el código mi rawDataName $ = "../dataFileToRead.txt"; INPUT abierto, "<", $ rawDataName;

Si ejecuto el script de perl desde el directorio bin entonces funciona bien

Si lo ejecuto desde el directorio padre, entonces no puede abrir el archivo de datos.

Respuesta

13

FindBin es la clásica solución a su problema. Si se escribe

use FindBin; 

continuación, el escalar $FindBin::Bin es la ruta absoluta a la ubicación de su script Perl. Puede chdir allí antes de abrir el archivo de datos, o simplemente usarlo en la ruta al archivo que desea abrir

my $rawDataName = "$FindBin::Bin/../dataFileToRead.txt"; 
open my $in, "<", $rawDataName; 

(Por cierto, siempre es mejor utilizar léxico manejos de archivo en otra cosa que una . muy antigua perl)

+0

https://encrypted.google.com/search?q=findbin+site:use .perl.org – daxim

+0

@daxim: su c omment es, presumiblemente, el mantra que * FindBin está roto *. Sé de esto, pero no puedo encontrar fácilmente una explicación, un ejemplo de su falla relevante para esta pregunta, o un módulo alternativo. Quizás puedas ayudarnos? – Borodin

+0

Enlaces directos: [FindBin está roto] (http://www.perlmonks.org/?node_id=41213) (corregido en el núcleo desde mediados de 2011 solamente); [FindBin parece pensar que es necesario recorrer todo el camino] (http://use.perl.org/comments.pl?sid=36400&cid=56760); [código alternativo] (http://use.perl.org/~Aristotle/journal/33996) o quizás FindBin :: Real o lib :: abs.Nunca tuve el deseo de hacer esta comparación porque nunca necesité FindBin o su equivalente funcional porque sé sobre el empaquetado y la característica de compartir directorios. – daxim

0

Las rutas relativas son relativas a la actual working directory. Si no tiene ningún control sobre el directorio de trabajo, entonces necesita encontrar una forma más sólida de spccificar sus rutas de archivos, p. utilice rutas absolutas, o quizás rutas relativas que son relativas a alguna ubicación específica dentro del sistema de archivos.

1

Comenzar por finding out where the script is.

Luego obtenga el directorio en el que se encuentra. Puede usar el método Path::Class::Filedir() para esto.

Finalmente puede usar chdir para cambiar el directorio de trabajo actual al directorio que acaba de identificar.

Por lo tanto, en teoría:

chdir(Path::Class::File->new(abs_path($0))->dir()); 
3

Para activar una ruta relativa en un absoluto puede utilizar Cwd:

use Cwd qw(realpath); 
print "'$0' is '", realpath($0), "'\n"; 
+0

La documentación de Cwd está actualmente disponible aquí: http://search.cpan.org/~smueller/PathTools-3.47/Cwd.pm –

+1

He actualizado la ruta de los documentos Cwd a una ruta permanente: http: // search .cpan.org/dist/PathTools/Cwd.pm Esa ruta siempre será la última, incluso si la versión cambia o incluso el propietario. –

Cuestiones relacionadas