2012-03-01 2 views
6

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

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

Например у меня есть структура

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

каталогов внутри скрипта PERL я открываю dataFileToRead.txt используя код мой $ rawDataName = "../dataFileToRead.txt"; open INPUT, "<", $ rawDataName;

Если я запускаю скрипт на языке Perl из каталога бен то он работает отлично

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

ответ

13

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

use FindBin; 

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

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

(Кстати, это всегда лучше использовать лексический файл обрабатывает на что-либо, кроме . очень старый Perl)

+0

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

+0

@ daxim: ваш c возможно, мантра, что * FindBin сломан *. Я знаю об этом, но не могу легко найти объяснение, пример его сбоя, связанного с этим вопросом, или альтернативный модуль. Может быть, вы можете нам помочь? – Borodin

+0

Прямые ссылки: [FindBin не работает] (http://www.perlmonks.org/?node_id=41213) (исправлено в ядре только с середины 2011 года); [FindBin, похоже, считает, что нужно пройти весь путь] (http://use.perl.org/comments.pl?sid=36400&cid=56760); [code alternative] (http://use.perl.org/~Aristotle/journal/33996) или, возможно, FindBin :: Real или lib :: abs.У меня никогда не было желания делать это сравнение, потому что мне никогда не нужен FindBin или функциональный эквивалент, потому что я знаю об упаковке и функции dir share. – daxim

0

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

1

finding out where the script is.

Тогда получите каталог, в котором он находится. Вы можете использовать метод Path::Class::Filedir().

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

Таким образом, в теории:

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

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

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

Документация Cwd в настоящее время доступна здесь: http://search.cpan.org/~smueller/PathTools-3.47/Cwd.pm –

+1

Я обновил путь к документам Cwd на постоянный путь: http: // search .cpan.org/dist/PathTools/Cwd.pm Этот путь всегда будет последним, даже если версия изменится или даже владелец. –

Смежные вопросы