$EXECUTABLE_NAME
$^X

用于执行当前 Perl 副本的名称,来自 C 的 argv[0] 或(在支持的情况下)/proc/self/exe

根据主机操作系统,$^X 的值可能是 Perl 程序文件的相对或绝对路径名,也可能是用于调用 Perl 的字符串,但不是 Perl 程序文件的路径名。此外,大多数操作系统允许调用不在 PATH 环境变量中的程序,因此不能保证 $^X 的值在 PATH 中。对于 VMS,该值可能包含或不包含版本号。

通常可以使用 $^X 的值重新调用当前正在运行的相同 Perl 的独立副本,例如:

@first_run = `$^X -le "print int rand 100 for 1..100"`;

但请记住,并非所有操作系统都支持分叉或捕获命令的输出,因此此复杂语句可能不可移植。

$^X的值用作文件路径名是不安全的,因为某些操作系统对可执行文件有强制后缀,但在调用命令时并不需要使用该后缀。要将$^X的值转换为路径名,请使用以下语句

# Build up a set of file names (not command names).
use Config;
my $this_perl = $^X;
if ($^O ne 'VMS') {
    $this_perl .= $Config{_exe}
    unless $this_perl =~ m/$Config{_exe}$/i;
}

由于许多操作系统允许任何拥有 Perl 程序文件读取权限的人复制该文件,修补该副本,然后执行该副本,因此注重安全的 Perl 程序员应该注意调用安装的 perl 副本,而不是$^X引用的副本。以下语句可以实现此目标,并生成一个可以作为命令调用或作为文件引用的路径名。

use Config;
my $secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS') {
    $secure_perl_path .= $Config{_exe}
    unless $secure_perl_path =~ m/$Config{_exe}$/i;
}