относительные пути к файлам в Perl - PullRequest
7 голосов
/ 01 марта 2012

У меня есть Perl-скрипт, который использует относительные пути к файлам.

Относительные пути кажутся относительными к местоположению, из которого выполняется скрипт, а не к местоположению скрипта perl. Как мне сделать мои относительные пути относительно местоположения скрипта?

Например, у меня есть структура каталогов

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

внутри скрипта perl я открываю dataFileToRead.txt используя код my $ rawDataName = "../dataFileToRead.txt"; открыть INPUT, "<", $ rawDataName; </p>

Если я запускаю скрипт perl из каталога bin, он работает нормально

Если я запускаю его из родительского каталога, он не может открыть файл данных.

Ответы [ 4 ]

13 голосов
/ 01 марта 2012

FindBin - это классическое решение вашей проблемы. Если ты пишешь

use FindBin;

тогда скаляр $FindBin::Bin - это абсолютный путь к местоположению вашего Perl-скрипта. Вы можете chdir там, прежде чем открыть файл данных, или просто использовать его в пути к файлу, который вы хотите открыть

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

(Между прочим, всегда лучше использовать лексические дескрипторы файлов на чем угодно, кроме очень старого perl.)

3 голосов
/ 01 марта 2012

Чтобы превратить относительный путь в абсолютный, вы можете использовать Cwd :

use Cwd qw(realpath);
print "'$0' is '", realpath($0), "'\n";
1 голос
/ 01 марта 2012

Начните с и выясните, где находится сценарий .

Затем получите каталог, в котором он находится. Для этого вы можете использовать Path :: Class :: File 'dir().

Наконец, вы можете использовать chdir, чтобы изменить текущий рабочий каталог на каталог, который вы только что определили.

Итак, в теории:

chdir(Path::Class::File->new(abs_path($0))->dir());
0 голосов
/ 01 марта 2012

Относительные пути относительно текущего рабочего каталога .Если у вас нет никакого контроля над рабочим каталогом, вам нужно найти более надежный способ для уточнения путей к вашим файлам, например, использовать абсолютные пути или, возможно, относительные пути, относящиеся к определенному месту в файловой системе.

...