2012-04-30 3 views
5

Есть ли способ получить абсолютный путь к исполняемому файлу Perl для текущего процесса?Получение абсолютного пути к perl исполняемому для текущего процесса

$^X предоставит мне исполняемое имя Perl, но в документе указано, что он иногда будет относительным путем, и это, похоже, верно для OS X, например.

ExtUtils :: MakeMaker, кажется, немного магии, чтобы найти абсолютный путь, так как Makefile он генерирует на моем OS X содержит

PERL = /usr/local/bin/perl 
FULLPERL = /usr/local/bin/perl 

, но я понятия не имею, как она делает это, или магия легкодоступными для других.

EDIT: Спасибо Бородин за сообщение $Config{perlpath}. Grepping для этого в ExtUtils, я нашел этот лакомый кусочек в ExtUtils :: MM_Unix :: _ fixin_replace_shebang, который, как я полагаю, использует MakeMaker для замены #! Perl правильной строкой shebang.

 
    if ($Config{startperl} =~ m,^\#!.*/perl,) { 
     $interpreter = $Config{startperl}; 
     $interpreter =~ s,^\#!,,; 
    } 
    else { 
     $interpreter = $Config{perlpath}; 
    } 

ответ

8

Я думаю, что вы ищете $Config{perlpath}.

Если вы хотите, чтобы ваш код был очень портативным, вам может потребоваться добавить тип файла к этому значению; это описано в документации perlport. В противном случае вам нужно всего лишь:

use Config; 
my $perl = $Config{perlpath}; 
0

Perl включает в себя модуль ядра File::Spec, который может перевести относительные пути к абсолютному пути.

my $full_path_to_perl = File::Spec->rel2abs($^X); 
+0

Это не будет работать во многих случаях. Часто '$^X' просто говорит' perl', в этом случае 'rel2abs' даст вам путь к CWD, что, вероятно, неверно. – friedo

1

Вы можете получить его через ядро ​​Config.

use Config; 
say $Config{perl5}; # current perl binary 

Я думаю что всегда должен содержать абсолютный путь, но я не могу гарантировать это.

+0

Документация для '$ Config {perl5}' довольно бесполезна: «Эта переменная содержит полный путь (если он есть) к ранее установленному perl5.005 или более поздней версии, подходящему для запуска скрипта для определения inc_version_list». – Telemachus

+1

Использование $ Config {perl5} дает мне Perl, который является первым в моем PATH, тогда как $ Config {perlpath} дает мне Perl, который в настоящее время выполняется. –

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