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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Спасибо Бородин за $Config{perlpath} совет. Разбираясь с этим в ExtUtils, я нашел этот кусок в ExtUtils::MM_Unix::_fixin_replace_shebang, который, как я полагаю, используется MakeMaker для замены #! Perl на правильную строку shebang.

    if ($ Config {startperl} = ~ m, ^ \ #!. * / perl,) {
        $ интерпретатор = $Config{startperl};
        $ интерпретатор =~ s,^\#!,,;
    }
    еще {
        $ интерпретатор = $Config{perlpath};
    }

3 ответа

Решение

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

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

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

Вы можете получить его через основной модуль Config.

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

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

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

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

Для perl6 (raku): $*EXECUTABLE-NAME содержит полный путь к запущенному в данный момент интерпретатору Raku (например, sys.executable для Python)

Чтобы получить полную командную строку:

say ($*EXECUTABLE-NAME, $*PROGRAM-NAME, |@*ARGS).join(' ');

Подробнее в документации по переменным

Другие вопросы по тегам