9

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

$^X会给我 Perl 可执行文件的名称,但文档指出它有时是相对路径,例如在 OS X 上似乎是这样。

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

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, ) {
    $interpreter = $Config{startperl};
    $interpreter =~ s,^\#!,,;
}
else {
    $interpreter = $Config{perlpath};
}
4

4 回答 4

11

我想你要找的是$Config{perlpath}.

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

use Config;
my $perl = $Config{perlpath};
于 2012-05-01T04:16:52.147 回答
0

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

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

认为应该始终包含绝对路径,但我不能保证。

于 2012-04-30T23:47:48.417 回答
-1

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

my $full_path_to_perl = File::Spec->rel2abs($^X);
于 2012-04-30T21:10:14.510 回答
-1

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

要获取完整的命令行:

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

更多变量文档

于 2020-03-04T21:04:22.273 回答