2009-06-23 7 views
3

мне нужно найти полный путь к сценарию Perl я в настоящее время работает, т.е.Как я могу получить абсолютный путь моей программы Perl от ее относительного пути?

  • для ~/реж/my.pl я должен был бы это быть «/ главная/пользователя/реж/мой .pl». $0 даст мне «~/dir/my.pl».

  • для ./my.pl я все еще нужно "/home/user/dir/my.pl"

и т.д. Спасибо!

ответ

6

Используйте FindBin модуль:

$ cat /tmp/foo/bar/baz/quux/prog 
#! /usr/bin/perl 

use FindBin; 

print "$FindBin::Bin/$FindBin::Script\n"; 

$ PATH=/tmp/foo/bar/baz/quux prog 
/tmp/foo/bar/baz/quux/prog 

$ cd /tmp/foo/bar/baz/quux 

$ ./prog 
/tmp/foo/bar/baz/quux/prog 
+0

да, это то, что мне нужно. спасибо –

+0

похоже, что он дает мне пустой $ FindBin :: Bin, хотя –

+0

Как вы управляете своей программой? –

1

Похоже, вам просто нужно расширить пути до их абсолютных значений. Проверьте, как это сделать this article.

+0

вы не можете расширять ./my.pl ни к чему, если вы не знаете, где вы были (т. Е. CWD), когда был сделан вызов. –

+0

Это также не обрабатывает расширение тильды. –

5

Это звучит, как вы ищете rel2abs function in File::Spec. Например:

#!/usr/bin/perl 

use File::Spec; 
my $location = File::Spec->rel2abs($0); 
print "$location\n"; 

Это разрешит $ 0, как вы описать:

$ ./myfile.pl 
/Users/myname/myfile.pl 
$ ~/myfile.pl 
/Users/myname/myfile.pl 

В качестве альтернативы можно использовать Cwd::abs_path в точно таким же образом.

+0

, к сожалению, нет, не будет. Это означает, что вы находитесь в том же каталоге, в котором вы были, когда был сделан вызов. Это может быть или не быть так –

+0

Хм ... нет, это не так? '$ export PATH = ~ /; cd/tmp /; myfile.pl '-> /Users/myname/myfile.pl –

+0

Я имею в виду, что myfile.pl, будучи сложной программой, может иметь cd-ed после его вызова, но прежде чем он попытается решить путь. Затем он разрешил /newdir/myfile.pl, если вызван как ./myfile.pl –

0

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

use strict; 
use English; 
use warnings; 

use Cwd qw(realpath); 
use File::Basename; 
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME)); 

Надеюсь, это поможет.

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