获取当前进程的perl可执行文件的绝对路径

时间:2012-04-30 20:31:11

标签: perl

有没有办法获得当前进程的Perl可执行文件的绝对路径?

$ ^ X将为我提供Perl可执行文件名,但是文档声明它有时会是一个相对路径,例如在OS X上这似乎是正确的。

ExtUtils :: MakeMaker似乎有一些神奇的东西可以找到绝对路径,因为它在我的OS X上生成的Makefile包含

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

但我不知道它是如何做到的,或者其他人是否可以随时获取魔法。

编辑:感谢Borodin提出$Config{perlpath}小费。在ExtUtils中对此进行了解决,我在ExtUtils :: MM_Unix :: _ fixin_replace_shebang中找到了这个小窍门,我猜这是MakeMaker使用正确的shebang代替#!perl的内容。

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

4 个答案:

答案 0 :(得分:8)

我认为你要找的是$Config{perlpath}

如果您希望代码非常便携,则可能需要将文件类型附加到该值;这在perlport文档中有所描述。否则你只需要这个:

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

答案 1 :(得分:1)

您可以通过核心Config模块获取它。

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

认为应始终包含绝对路径,但我无法保证。

答案 2 :(得分:0)

Perl包含核心模块File::Spec,它可以将相对路径转换为绝对路径。

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

答案 3 :(得分:-1)

对于perl6(raku):$*EXECUTABLE-NAME包含当前运行的Raku解释器的完整路径(如Python的sys.executable

要获取完整的命令行:

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

Variable Documentation中的更多内容